Added rename option to macro
This commit is contained in:
parent
9449a83f61
commit
d8198bf5b0
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user