feat: Added support for flatten

This commit is contained in:
2025-09-15 21:32:57 +02:00
parent 2b970e87ae
commit 6d5c2da030
2 changed files with 40 additions and 5 deletions

View File

@@ -11,6 +11,7 @@ struct StructField {
ty: syn::Type,
case: Option<Case<'static>>,
default: bool,
flatten: bool,
}
impl ToTokens for StructField {
@@ -23,13 +24,19 @@ impl ToTokens for StructField {
let ty = &self.ty;
let default = if self.default { "?" } else { "" };
if self.flatten {
tokens.extend(quote! {
<#ty as Typed>::generate_members().unwrap_or("".to_string())
});
} else {
let default = if self.default { "?" } else { "" };
let format = format!("---@field {} {{}}{}\n", name, default);
let format = format!("---@field {} {{}}{}\n", name, default);
tokens.extend(quote! {
format!(#format, <#ty as Typed>::type_name())
});
tokens.extend(quote! {
format!(#format, <#ty as Typed>::type_name())
});
}
}
}
@@ -168,6 +175,7 @@ pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let mut fields = Vec::new();
for field in data_struct.fields {
let mut default = false;
let mut flatten = false;
for attr in &field.attrs {
if attr.path().is_ident("serde")
&& let Err(err) = attr.parse_nested_meta(|meta| {
@@ -177,6 +185,8 @@ pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
meta.input.parse::<Token![=]>()?;
meta.input.parse::<LitStr>()?;
}
} else if meta.path.is_ident("flatten") {
flatten = true;
}
Ok(())
@@ -191,6 +201,7 @@ pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
ty: field.ty,
case,
default,
flatten,
});
}

24
tests/flatten.rs Normal file
View File

@@ -0,0 +1,24 @@
use lua_typed::Typed;
#[derive(Typed)]
pub struct B {
pub hello: String,
pub world: bool,
}
#[derive(Typed)]
pub struct A {
#[serde(flatten)]
pub b: B,
pub cool: u32,
}
#[test]
fn flatten() {
insta::assert_snapshot!(<A as Typed>::generate_full().unwrap(), @r"
---@class A
---@field hello string
---@field world boolean
---@field cool integer
");
}