Added rename option to macro

This commit is contained in:
Dreaded_X 2024-04-25 02:02:31 +02:00
parent 7f0b2b3021
commit 45c9e9e1d4
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4

View File

@ -57,6 +57,7 @@ fn impl_lua_device_macro(ast: &syn::DeriveInput) -> TokenStream {
enum Arg { enum Arg {
Flatten, Flatten,
UserData, UserData,
Rename(String),
With(TokenStream), With(TokenStream),
Default(Option<syn::Ident>), Default(Option<syn::Ident>),
} }
@ -66,6 +67,15 @@ impl syn::parse::Parse for Arg {
let arg = match input.parse::<syn::Ident>()?.to_string().as_str() { let arg = match input.parse::<syn::Ident>()?.to_string().as_str() {
"flatten" => Arg::Flatten, "flatten" => Arg::Flatten,
"user_data" => Arg::UserData, "user_data" => Arg::UserData,
"rename" => {
input.parse::<Token![=]>()?;
let lit = input.parse::<syn::Lit>()?;
if let syn::Lit::Str(lit_str) = lit {
Arg::Rename(lit_str.value())
} else {
panic!("Expected literal string");
}
}
"with" => { "with" => {
input.parse::<Token![=]>()?; input.parse::<Token![=]>()?;
let lit = input.parse::<syn::Lit>()?; let lit = input.parse::<syn::Lit>()?;
@ -108,6 +118,7 @@ impl syn::parse::Parse for ArgsParser {
struct Args { struct Args {
flatten: bool, flatten: bool,
user_data: bool, user_data: bool,
rename: Option<String>,
with: Option<TokenStream>, with: Option<TokenStream>,
default: Option<Option<syn::Ident>>, default: Option<Option<syn::Ident>>,
} }
@ -117,6 +128,7 @@ impl Args {
let mut result = Args { let mut result = Args {
flatten: false, flatten: false,
user_data: false, user_data: false,
rename: None,
with: None, with: None,
default: None, default: None,
}; };
@ -134,6 +146,12 @@ impl Args {
} }
result.user_data = true 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) => { Arg::With(ty) => {
if result.with.is_some() { if result.with.is_some() {
panic!("Option 'with' is already set") 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 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 // TODO: Improve how optional fields are detected
let optional = if let syn::Type::Path(path) = field.ty.clone() { let optional = if let syn::Type::Path(path) = field.ty.clone() {
path.path.segments.first().unwrap().ident == "Option" path.path.segments.first().unwrap().ident == "Option"
@ -220,7 +244,7 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream {
quote! { Default::default() } quote! { Default::default() }
} }
} else { } else {
let missing = format!("Missing field '{field_name}'"); let missing = format!("Missing field '{table_name}'");
quote! { panic!(#missing) } quote! { panic!(#missing) }
}; };
@ -232,8 +256,8 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream {
} else if args.user_data { } else if args.user_data {
// println!("UserData: {}", field_name); // println!("UserData: {}", field_name);
quote! { quote! {
if table.contains_key(stringify!(#field_name))? { if table.contains_key(#table_name)? {
table.get(stringify!(#field_name))? table.get(#table_name)?
} else { } else {
#default #default
} }
@ -242,7 +266,7 @@ fn impl_lua_device_config_macro(ast: &syn::DeriveInput) -> TokenStream {
// println!("Value: {}", field_name); // println!("Value: {}", field_name);
quote! { 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() { if !#field_name.is_nil() {
mlua::LuaSerdeExt::from_value(lua, #field_name)? mlua::LuaSerdeExt::from_value(lua, #field_name)?
} else { } else {