From d2de4b5830c53feebb0d06c987f93a22fa6f3b3d Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sat, 20 Sep 2025 05:32:59 +0200 Subject: [PATCH] feat: Allow renaming fields --- lua_typed_macro/src/lib.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/lua_typed_macro/src/lib.rs b/lua_typed_macro/src/lib.rs index b3af2fa..18e38fa 100644 --- a/lua_typed_macro/src/lib.rs +++ b/lua_typed_macro/src/lib.rs @@ -10,7 +10,7 @@ use syn::{DataEnum, DataStruct, DeriveInput, LitStr, Token, parse_macro_input, s #[derive(Debug, Clone)] struct StructField { - name: syn::Ident, + name: LitStr, ty: syn::Type, case: Option>, optional: bool, @@ -19,7 +19,7 @@ struct StructField { impl ToTokens for StructField { fn to_tokens(&self, tokens: &mut TokenStream2) { - let mut name = self.name.to_string(); + let mut name = self.name.value(); if let Some(case) = self.case { name = name.to_case(case); @@ -283,6 +283,9 @@ fn parse_fields( for field in input { let mut default = false; let mut flatten = false; + let name = field.ident.expect("We already checked that ident is some"); + let mut as_name = LitStr::new(&name.to_string(), name.span()); + for attr in &field.attrs { if attr.path().is_ident("serde") && let Err(err) = attr.parse_nested_meta(|meta| { @@ -307,10 +310,25 @@ fn parse_fields( { return Err(err); } + + if attr.path().is_ident("typed") + && let Err(err) = attr.parse_nested_meta(|meta| { + if meta.path.is_ident("as") { + let value = meta.value()?; + as_name = value.parse()?; + + Ok(()) + } else { + Err(syn::Error::new(meta.path.span(), "Unknown attribute")) + } + }) + { + return Err(err); + } } fields.push(StructField { - name: field.ident.expect("We already checked that ident is some"), + name: as_name, ty: field.ty, case, optional: default,