aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-21 06:37:21 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-21 06:37:21 +0800
commit8a230bd93b4801cc9001d0611ade16261e4f0cc4 (patch)
treec2e0cfff925ca7901d0599965d1e35262b08952d /mingling_macros/src
parentd3abdd53e0cc86cb41c0793ce99dbb21b89a4361 (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/src')
-rw-r--r--mingling_macros/src/attr/chain.rs22
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