diff options
Diffstat (limited to 'crates/system_action/action_macros')
| -rw-r--r-- | crates/system_action/action_macros/src/lib.rs | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/crates/system_action/action_macros/src/lib.rs b/crates/system_action/action_macros/src/lib.rs index 1bc18f7..5d274ad 100644 --- a/crates/system_action/action_macros/src/lib.rs +++ b/crates/system_action/action_macros/src/lib.rs @@ -30,7 +30,8 @@ fn generate_action_struct(input_fn: ItemFn, _is_local: bool) -> proc_macro2::Tok validate_function_signature(fn_sig); - let (arg_type, return_type) = extract_types(fn_sig); + let (context_param_name, arg_param_name, arg_type, return_type) = + extract_parameters_and_types(fn_sig); let struct_name = quote::format_ident!("{}", convert_to_pascal_case(&fn_name.to_string())); @@ -49,7 +50,7 @@ fn generate_action_struct(input_fn: ItemFn, _is_local: bool) -> proc_macro2::Tok !#_is_local } - async fn process(context: action_system::action::ActionContext, args: #arg_type) -> Result<#return_type, tcp_connection::error::TcpTargetError> { + async fn process(#context_param_name: action_system::action::ActionContext, #arg_param_name: #arg_type) -> Result<#return_type, tcp_connection::error::TcpTargetError> { #fn_block } } @@ -57,7 +58,6 @@ fn generate_action_struct(input_fn: ItemFn, _is_local: bool) -> proc_macro2::Tok #[deprecated = "This function is used by #[action_gen] as a template."] #[doc = " This function is used by #[action_gen] as a template to generate the struct. "] #[doc = " It is forbidden to call it anywhere."] - #[doc = " You should use the generated struct to register this function in `ActionPool`"] #[doc = " and call it using the function name."] #fn_vis #fn_sig #fn_block } @@ -109,21 +109,39 @@ fn convert_to_pascal_case(s: &str) -> String { .collect() } -fn extract_types(fn_sig: &syn::Signature) -> (proc_macro2::TokenStream, proc_macro2::TokenStream) { +fn extract_parameters_and_types( + fn_sig: &syn::Signature, +) -> ( + proc_macro2::TokenStream, + proc_macro2::TokenStream, + proc_macro2::TokenStream, + proc_macro2::TokenStream, +) { let mut inputs = fn_sig.inputs.iter(); - let _ = inputs.next(); + let context_param = match inputs.next() { + Some(syn::FnArg::Typed(pat_type)) => { + let pat = &pat_type.pat; + quote::quote!(#pat) + } + _ => { + panic!("Expected the first argument to be a typed parameter, but found something else") + } + }; - let arg_type = match inputs.next() { + let arg_param = match inputs.next() { Some(syn::FnArg::Typed(pat_type)) => { + let pat = &pat_type.pat; let ty = &pat_type.ty; - quote::quote!(#ty) + (quote::quote!(#pat), quote::quote!(#ty)) } _ => { panic!("Expected the second argument to be a typed parameter, but found something else") } }; + let (arg_param_name, arg_type) = arg_param; + let return_type = match &fn_sig.output { syn::ReturnType::Type(_, ty) => { if let syn::Type::Path(type_path) = ty.as_ref() { @@ -145,5 +163,5 @@ fn extract_types(fn_sig: &syn::Signature) -> (proc_macro2::TokenStream, proc_mac _ => panic!("Expected function to have return type, but found none"), }; - (arg_type, return_type) + (context_param, arg_param_name, arg_type, return_type) } |
