xso: add support for ignoring unknown stuff in extracts

This commit is contained in:
Jonas Schäfer 2024-10-03 12:56:04 +02:00 committed by Link Mauve
commit 7d8ffe45a7
4 changed files with 70 additions and 1 deletions

View file

@ -319,6 +319,8 @@ fn new_field(
qname: QNameRef { namespace, name },
amount,
fields,
on_unknown_attribute,
on_unknown_child,
} => {
let xml_namespace = namespace.unwrap_or_else(|| container_namespace.clone());
let xml_name = default_name(span, name, field_ident)?;
@ -366,7 +368,8 @@ fn new_field(
&xml_namespace,
));
}
let parts = Compound::from_field_defs(field_defs, None, None)?;
let parts =
Compound::from_field_defs(field_defs, on_unknown_attribute, on_unknown_child)?;
Ok(Box::new(ChildField {
default_,

View file

@ -737,6 +737,12 @@ pub(crate) enum XmlFieldMeta {
/// The `fields` nested meta.
fields: Vec<XmlFieldMeta>,
/// The `on_unknown_attribute` value.
on_unknown_attribute: Option<Ident>,
/// The `on_unknown_child` value.
on_unknown_child: Option<Ident>,
},
/// `#[xml(element)]`
@ -925,6 +931,8 @@ impl XmlFieldMeta {
let mut qname = QNameRef::default();
let mut fields = None;
let mut amount = None;
let mut on_unknown_attribute = None;
let mut on_unknown_child = None;
let mut default_ = Flag::Absent;
meta.parse_nested_meta(|meta| {
if meta.path.is_ident("default") {
@ -952,6 +960,24 @@ impl XmlFieldMeta {
}
amount = Some(meta.value()?.parse()?);
Ok(())
} else if meta.path.is_ident("on_unknown_attribute") {
if on_unknown_attribute.is_some() {
return Err(Error::new_spanned(
meta.path,
"duplicate `on_unknown_attribute` key",
));
}
on_unknown_attribute = Some(meta.value()?.parse()?);
Ok(())
} else if meta.path.is_ident("on_unknown_child") {
if on_unknown_child.is_some() {
return Err(Error::new_spanned(
meta.path,
"duplicate `on_unknown_child` key",
));
}
on_unknown_child = Some(meta.value()?.parse()?);
Ok(())
} else {
match qname.parse_incremental_from_meta(meta)? {
None => Ok(()),
@ -966,6 +992,8 @@ impl XmlFieldMeta {
qname,
fields,
amount,
on_unknown_attribute,
on_unknown_child,
})
}