diff --git a/foundations-macros/src/settings.rs b/foundations-macros/src/settings.rs index 37966ab0..e91e1ef1 100644 --- a/foundations-macros/src/settings.rs +++ b/foundations-macros/src/settings.rs @@ -82,11 +82,20 @@ struct SerdeArgs { impl SerdeArgs { fn parse_from_attrs(attrs: &[Attribute]) -> Result> { - let Some(attr) = attrs.iter().find(|a| a.path().is_ident("serde")) else { + let mut serde_attrs = attrs + .iter() + .filter(|a| a.path().is_ident("serde")) + .peekable(); + if serde_attrs.peek().is_none() { return Ok(None); - }; + } + + let mut meta_list = Vec::new(); + for attr in serde_attrs { + meta_list.extend(attr.parse_args_with(|input: ParseStream| parse_meta_list(&input))?); + } - Ok(Some(Self::from_meta(&attr.meta)?)) + Ok(Some(Self::from_list(&meta_list)?)) } } diff --git a/foundations/tests/settings.rs b/foundations/tests/settings.rs index 1921f963..93a20f62 100644 --- a/foundations/tests/settings.rs +++ b/foundations/tests/settings.rs @@ -8,6 +8,7 @@ struct NestedStruct { a: usize, /// multi-line /// doc comment + #[serde(alias = "legacy_b")] #[serde(default = "NestedStruct::default_b")] b: u32, // no doc comment at all @@ -42,6 +43,7 @@ struct NestedDup { struct FlattenedStruct { /// Doc comments on flattened members itself /// should not appear on the output. + #[serde(default)] #[serde(flatten)] inner: NestedStruct, /// Another field that isn't flattened. @@ -262,6 +264,9 @@ fn defaults() { assert_eq!(simple_struct.b, 0xb); assert_eq!(simple_struct.c, 0); + let aliased_struct = from_yaml_str::("legacy_b: 123").unwrap(); + assert_eq!(aliased_struct.b, 123); + let nested_struct = from_yaml_str::("---\nx: 1").unwrap(); assert_eq!(nested_struct.inner.b, 0xb);