From 5e4a9ee4c9bbd1a5007f2b7300edb753bfac472a Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Thu, 25 Apr 2024 02:02:31 +0200 Subject: [PATCH] Added rename option to macro --- automation_macro/src/lib.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/automation_macro/src/lib.rs b/automation_macro/src/lib.rs index 2bdf53d..42c05e6 100644 --- a/automation_macro/src/lib.rs +++ b/automation_macro/src/lib.rs @@ -57,6 +57,7 @@ fn impl_lua_device_macro(ast: &syn::DeriveInput) -> TokenStream { enum Arg { Flatten, UserData, + Rename(String), With(TokenStream), Default(Option), } @@ -66,6 +67,15 @@ impl syn::parse::Parse for Arg { let arg = match input.parse::()?.to_string().as_str() { "flatten" => Arg::Flatten, "user_data" => Arg::UserData, + "rename" => { + input.parse::()?; + let lit = input.parse::()?; + if let syn::Lit::Str(lit_str) = lit { + Arg::Rename(lit_str.value()) + } else { + panic!("Expected literal string"); + } + } "with" => { input.parse::()?; let lit = input.parse::()?; @@ -108,6 +118,7 @@ impl syn::parse::Parse for ArgsParser { struct Args { flatten: bool, user_data: bool, + rename: Option, with: Option, default: Option>, } @@ -117,6 +128,7 @@ impl Args { let mut result = Args { flatten: false, user_data: false, + rename: None, with: None, default: None, }; @@ -134,6 +146,12 @@ impl Args { } result.user_data = true } + Arg::Rename(name) => { + if result.rename.is_some() { + panic!("Option 'rename' is already set") + } + result.rename = Some(name) + } Arg::With(ty) => { if result.with.is_some() { panic!("Option 'with' is already set") @@ -204,6 +222,12 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream { let args = Args::new(args); + let table_name = if let Some(name) = args.rename { + name + } else { + field_name.to_string() + }; + // TODO: Improve how optional fields are detected let optional = if let syn::Type::Path(path) = field.ty.clone() { path.path.segments.first().unwrap().ident == "Option" @@ -220,7 +244,7 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream { quote! { Default::default() } } } else { - let missing = format!("Missing field '{field_name}'"); + let missing = format!("Missing field '{table_name}'"); quote! { panic!(#missing) } }; @@ -232,8 +256,8 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream { } else if args.user_data { // println!("UserData: {}", field_name); quote! { - if table.contains_key(stringify!(#field_name))? { - table.get(stringify!(#field_name))? + if table.contains_key(#table_name)? { + table.get(#table_name)? } else { #default } @@ -242,7 +266,7 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream { // println!("Value: {}", field_name); quote! { { - let #field_name: mlua::Value = table.get(stringify!(#field_name))?; + let #field_name: mlua::Value = table.get(#table_name)?; if !#field_name.is_nil() { mlua::LuaSerdeExt::from_value(lua, #field_name)? } else {