diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-08-10 16:19:45 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-08-10 16:19:45 +0800 |
| commit | 2d0aae4b2d595ced100f7a2ec8d13b872a5eb65e (patch) | |
| tree | 9df306e1185470655f3ed43fad866cf02430160f /mingling_macros/src/attr | |
| parent | 61b770ca958afa7e5eca4c50f5e06bdf3ed7a94a (diff) | |
refactor: simplify macro parsing code and fix clippy warnings
Diffstat (limited to 'mingling_macros/src/attr')
| -rw-r--r-- | mingling_macros/src/attr/command.rs | 19 | ||||
| -rw-r--r-- | mingling_macros/src/attr/dispatcher_clap.rs | 55 | ||||
| -rw-r--r-- | mingling_macros/src/attr/program_setup.rs | 2 |
3 files changed, 39 insertions, 37 deletions
diff --git a/mingling_macros/src/attr/command.rs b/mingling_macros/src/attr/command.rs index 9598fa8..bec4dc2 100644 --- a/mingling_macros/src/attr/command.rs +++ b/mingling_macros/src/attr/command.rs @@ -51,8 +51,7 @@ impl Parse for CommandArgs { entry = Some(input.parse()?); } else { return Err(input.error(format!( - "unknown key `{}`; expected `node`, `name`, or `entry`", - key + "unknown key `{key}`; expected `node`, `name`, or `entry`" ))); } } else { @@ -67,7 +66,7 @@ impl Parse for CommandArgs { } } - Ok(CommandArgs { + Ok(Self { node, name, entry, @@ -142,10 +141,10 @@ struct ResolvedNames { fn resolve_names(fn_name: &Ident, args: &CommandArgs) -> ResolvedNames { let fn_name_str = fn_name.to_string(); - let node_str = match &args.node { - Some(lit) => lit.value(), - None => default_node_from_fn(fn_name), - }; + let node_str = args + .node + .as_ref() + .map_or_else(|| default_node_from_fn(fn_name), syn::LitStr::value); let node_lit = syn::LitStr::new(&node_str, fn_name.span()); let has_overrides = args.node.is_some() || args.name.is_some() || args.entry.is_some(); @@ -160,7 +159,7 @@ fn resolve_names(fn_name: &Ident, args: &CommandArgs) -> ResolvedNames { Ident::new(&format!("Entry{pascal}"), fn_name.span()) }); - let chain_fn_name = Ident::new(&format!("__command_chain_{}", fn_name_str), fn_name.span()); + let chain_fn_name = Ident::new(&format!("__command_chain_{fn_name_str}"), fn_name.span()); ResolvedNames { node_lit, @@ -213,7 +212,7 @@ fn build_wrapper_params( let mut params = syn::punctuated::Punctuated::new(); let entry_param: FnArg = syn::parse_quote! { _args: #entry_type }; params.push(entry_param); - for arg in sig.inputs.iter() { + for arg in &sig.inputs { params.push(arg.clone()); } params @@ -317,7 +316,7 @@ pub(crate) fn command_attr(attr: TokenStream, item: TokenStream) -> TokenStream let wrapper_full = format!("__command_chain_{}", &fn_name_s); let snaked_wrapper = just_fmt::snake_case!(wrapper_full); let chain_internal = Ident::new( - &format!("__internal_chain_{}", snaked_wrapper), + &format!("__internal_chain_{snaked_wrapper}"), fn_name.span(), ); diff --git a/mingling_macros/src/attr/dispatcher_clap.rs b/mingling_macros/src/attr/dispatcher_clap.rs index 218750c..c0665d0 100644 --- a/mingling_macros/src/attr/dispatcher_clap.rs +++ b/mingling_macros/src/attr/dispatcher_clap.rs @@ -39,11 +39,11 @@ impl Parse for ClapOptions { error_struct = Some(value); } else if key == "help" { let value: LitBool = input.parse()?; - if !value.value() { + if value.value() { + help_enabled = true; + } else { // help = false is allowed but does nothing help_enabled = false; - } else { - help_enabled = true; } } else { return Err(syn::Error::new( @@ -53,14 +53,14 @@ impl Parse for ClapOptions { } } - Ok(ClapOptions { + Ok(Self { error_struct, help_enabled, }) } } -/// Input for the dispatcher_clap attribute +/// Input for the `dispatcher_clap` attribute struct DispatcherClapInput { /// `("cmd", Disp, ...)` command_name: LitStr, @@ -84,7 +84,7 @@ impl Parse for DispatcherClapInput { input.parse::<ClapOptions>()? }; - Ok(DispatcherClapInput { + Ok(Self { command_name, dispatcher_struct, options, @@ -105,28 +105,31 @@ pub(crate) fn dispatcher_clap_attr(attr: TokenStream, item: TokenStream) -> Toke let options = &attr_input.options; // Generate the `begin` method body - let begin_body = if let Some(ref error_struct) = options.error_struct { - quote! { - if ::mingling::this::<#program_path>().user_context.help { - return ::mingling::Routable::<#program_path>::to_chain(#struct_name::default()); - } - match <#struct_name as ::clap::Parser>::try_parse_from(clap_args) { - Ok(parsed) => ::mingling::Routable::<#program_path>::to_chain(parsed), - Err(e) => { - return ::mingling::Routable::<#program_path>::to_render(#error_struct::new(format!("{}", e.render().ansi()))) - }, + let begin_body = options.error_struct.as_ref().map_or_else( + || { + quote! { + if ::mingling::this::<#program_path>().user_context.help { + return ::mingling::Routable::<#program_path>::to_chain(#struct_name::default()); + } + let parsed = <#struct_name as ::clap::Parser>::try_parse_from(clap_args) + .unwrap_or_else(|e| e.exit()); + ::mingling::Routable::<#program_path>::to_chain(parsed) } - } - } else { - quote! { - if ::mingling::this::<#program_path>().user_context.help { - return ::mingling::Routable::<#program_path>::to_chain(#struct_name::default()); + }, + |error_struct| { + quote! { + if ::mingling::this::<#program_path>().user_context.help { + return ::mingling::Routable::<#program_path>::to_chain(#struct_name::default()); + } + match <#struct_name as ::clap::Parser>::try_parse_from(clap_args) { + Ok(parsed) => ::mingling::Routable::<#program_path>::to_chain(parsed), + Err(e) => { + return ::mingling::Routable::<#program_path>::to_render(#error_struct::new(format!("{}", e.render().ansi()))) + }, + } } - let parsed = <#struct_name as ::clap::Parser>::try_parse_from(clap_args) - .unwrap_or_else(|e| e.exit()); - ::mingling::Routable::<#program_path>::to_chain(parsed) - } - }; + }, + ); // Generate the error pack type let error_pack = options.error_struct.as_ref().map(|error_struct| { diff --git a/mingling_macros/src/attr/program_setup.rs b/mingling_macros/src/attr/program_setup.rs index dee5a1c..fa01178 100644 --- a/mingling_macros/src/attr/program_setup.rs +++ b/mingling_macros/src/attr/program_setup.rs @@ -47,7 +47,7 @@ fn extract_return_type(sig: &Signature) -> syn::Result<()> { } } -pub(crate) fn setup_attr(attr: TokenStream, item: TokenStream) -> TokenStream { +pub(crate) fn setup_attr(attr: &TokenStream, item: TokenStream) -> TokenStream { // #[program_setup] takes no arguments; always use the default program path let _ = attr; let program_path = crate::default_program_path(); |
