diff --git a/src/macros/admin.rs b/src/macros/admin.rs index 624d95d5..9309c41c 100644 --- a/src/macros/admin.rs +++ b/src/macros/admin.rs @@ -4,7 +4,10 @@ use proc_macro2::TokenStream as TokenStream2; use quote::{ToTokens, quote}; use syn::{Attribute, Error, Fields, Ident, ItemEnum, ItemFn, Meta, Variant, parse_quote}; -use crate::{Result, utils::camel_to_snake_string}; +use crate::{ + Result, + utils::{camel_to_snake_string, get_simple_settings}, +}; pub(super) fn command(mut item: ItemFn, _args: &[Meta]) -> Result { let attr: Attribute = parse_quote! { @@ -15,13 +18,20 @@ pub(super) fn command(mut item: ItemFn, _args: &[Meta]) -> Result { Ok(item.into_token_stream().into()) } -pub(super) fn command_dispatch(item: ItemEnum, _args: &[Meta]) -> Result { +pub(super) fn command_dispatch(item: ItemEnum, args: &[Meta]) -> Result { let name = &item.ident; + let opts = get_simple_settings(args); + let prefix = opts + .get("handler_prefix") + .map(|s| format!("{s}_")) + .unwrap_or_default(); + let arm: Vec = item .variants .iter() - .map(dispatch_arm) + .map(|variant| dispatch_arm(variant, prefix.as_str())) .try_collect()?; + let switch = quote! { #[allow(clippy::large_stack_frames)] //TODO: fixme pub(super) async fn process( @@ -42,9 +52,10 @@ pub(super) fn command_dispatch(item: ItemEnum, _args: &[Meta]) -> Result Result { +fn dispatch_arm(v: &Variant, prefix: &str) -> Result { let name = &v.ident; let target = camel_to_snake_string(&format!("{name}")); + let target = format!("{prefix}{target}"); let handler = Ident::new(&target, Span::call_site().into()); let res = match &v.fields { | Fields::Named(fields) => { @@ -52,6 +63,7 @@ fn dispatch_arm(v: &Variant) -> Result { .named .iter() .filter_map(|f| f.ident.as_ref()); + let arg = field.clone(); quote! { #name { #( #field ),* } => { @@ -63,6 +75,7 @@ fn dispatch_arm(v: &Variant) -> Result { let Some(ref field) = fields.unnamed.first() else { return Err(Error::new(Span::call_site().into(), "One unnamed field required")); }; + quote! { #name ( #field ) => { Box::pin(#handler::process(#field, context)).await