aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src/attr
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-08-10 16:19:45 +0800
committer魏曹先生 <1992414357@qq.com>2026-08-10 16:19:45 +0800
commit2d0aae4b2d595ced100f7a2ec8d13b872a5eb65e (patch)
tree9df306e1185470655f3ed43fad866cf02430160f /mingling_macros/src/attr
parent61b770ca958afa7e5eca4c50f5e06bdf3ed7a94a (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.rs19
-rw-r--r--mingling_macros/src/attr/dispatcher_clap.rs55
-rw-r--r--mingling_macros/src/attr/program_setup.rs2
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();