feat: Added support for flatten
This commit is contained in:
@@ -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
24
tests/flatten.rs
Normal 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
|
||||
");
|
||||
}
|
||||
Reference in New Issue
Block a user