From 1eaa5f87d091ff7d703142e48c352f4c4cc4b9b7 Mon Sep 17 00:00:00 2001 From: Taku Fukada Date: Tue, 2 Jan 2024 14:04:35 +0900 Subject: [PATCH] reject unexpected elements --- nusamai-citygml/macros/src/derive.rs | 13 ++++++++++++- nusamai-citygml/macros/src/type_attrs.rs | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/nusamai-citygml/macros/src/derive.rs b/nusamai-citygml/macros/src/derive.rs index 2be5d3f0b..f0808da34 100644 --- a/nusamai-citygml/macros/src/derive.rs +++ b/nusamai-citygml/macros/src/derive.rs @@ -39,7 +39,7 @@ fn generate_citygml_impl_for_struct( let struct_ident = &derive_input.ident; let mut typename = String::from(stringify!(derive_input.ident)); let mut ty = StereoType::Feature; - let mut allow_extra = true; // FIXME + let mut allow_extra = false; for attr in &derive_input.attrs { if !attr.path().is_ident(CITYGML_ATTR_IDENT) { @@ -202,6 +202,17 @@ fn generate_citygml_impl_for_struct( Some(self.#field_ident) }; + Ok(()) + } else if meta.path.is_ident("generics") { + chlid_arms.push(quote! { + b"gen:dateAttribute" => st.skip_current_element(), + b"gen:doubleAttribute" => st.skip_current_element(), + b"gen:genericAttributeSet" => st.skip_current_element(), + b"gen:intAttribute" => st.skip_current_element(), + b"gen:measureAttribute" => st.skip_current_element(), + b"gen:stringAttribute" => st.skip_current_element(), + b"gen:uriAttribute" => st.skip_current_element(), + }); Ok(()) } else { Err(meta.error("unrecognized argument")) diff --git a/nusamai-citygml/macros/src/type_attrs.rs b/nusamai-citygml/macros/src/type_attrs.rs index 3821385a2..4d0b8b1de 100644 --- a/nusamai-citygml/macros/src/type_attrs.rs +++ b/nusamai-citygml/macros/src/type_attrs.rs @@ -161,6 +161,14 @@ fn modify(ty: &StereoType, args: &FeatureArgs, input: &mut DeriveInput) -> Resul pub valid_to: Option // TODO: DateTime (CityGML 3.0) }, ); + // TODO: not implemented yet + add_named_field( + fields, + quote! { + #[citygml(generics)] + pub generic_attribute: Option // FIXME: + }, + ); } } }