feat: Allow renaming fields

This commit is contained in:
2025-09-20 05:32:59 +02:00
parent fe958b863a
commit d2de4b5830

View File

@@ -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<Case<'static>>,
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,