diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-21 06:37:21 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-21 06:37:21 +0800 |
| commit | 8a230bd93b4801cc9001d0611ade16261e4f0cc4 (patch) | |
| tree | c2e0cfff925ca7901d0599965d1e35262b08952d /mingling_macros | |
| parent | d3abdd53e0cc86cb41c0793ce99dbb21b89a4361 (diff) | |
refactor(chain): replace Into turbofish with Routable::to_chain
Remove the `origin_return_type` parameter and replace the generic `Into`
conversion with a direct call to `Routable::<#program_type>::to_chain`.
For non-unit returns, also wrap the function call expression in
`to_chain()` upfront to satisfy the `ChainProcess<C>` requirement of
`__modify_res_and_return_route`.
Diffstat (limited to 'mingling_macros')
| -rw-r--r-- | mingling_macros/src/attr/chain.rs | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/mingling_macros/src/attr/chain.rs b/mingling_macros/src/attr/chain.rs index dbd87dd..dc28a39 100644 --- a/mingling_macros/src/attr/chain.rs +++ b/mingling_macros/src/attr/chain.rs @@ -44,7 +44,6 @@ fn generate_proc_fn( previous_type: &TypePath, is_async_fn: bool, is_unit_return: bool, - origin_return_type: &proc_macro2::TokenStream, ) -> proc_macro2::TokenStream { let immut_resource_stmts = generate_immut_resource_bindings(resources.iter(), program_type); let mut_resources: Vec<_> = resources.iter().filter(|r| r.is_mut).collect(); @@ -82,8 +81,14 @@ fn generate_proc_fn( } }; - // Convert the function call to a syn::Stmt so existing wrapping functions can use it - let fn_call_expr: syn::Expr = syn::parse_quote! { #fn_call }; + // Convert the function call to a syn::Stmt so existing wrapping functions can use it. + // For non-unit returns, wrap in `to_chain()` so mutable-resource closures + // return `ChainProcess<C>` (as required by `__modify_res_and_return_route`). + let fn_call_expr: syn::Expr = if is_unit_return { + syn::parse_quote! { #fn_call } + } else { + syn::parse_quote! { ::mingling::Routable::<#program_type>::to_chain(#fn_call) } + }; let fn_call_stmt = syn::Stmt::Expr(fn_call_expr, None); let wrapped_body = if is_async_fn && !mut_resources.is_empty() { @@ -124,9 +129,7 @@ fn generate_proc_fn( }; quote! { let __chain_result = { #body }; - <#origin_return_type as ::std::convert::Into< - ::mingling::ChainProcess<#program_type> - >>::into(__chain_result) + ::mingling::Routable::<#program_type>::to_chain(__chain_result) } }; @@ -249,12 +252,6 @@ pub(crate) fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream { // Always use the default crate-defined program path let program_type = crate::default_program_path(); - // Extract the user's return type for the explicit Into turbofish - let origin_return_type = match &input_fn.sig.output { - ReturnType::Type(_, ty) => quote! { #ty }, - ReturnType::Default => quote! { () }, - }; - // Generate the `proc` function for the Chain impl let proc_fn = generate_proc_fn( fn_name, @@ -267,7 +264,6 @@ pub(crate) fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream { #[cfg(not(feature = "async"))] false, is_unit_return, - &origin_return_type, ); // Preserve the original function untouched |
