xso: discard xml:lang implicitly

Jonas Schäfer created

Because this attribute may occur in random places, it makes no sense
failing on it. We discard it after attribute processing though, so it
can still be captured by structs which are explicitly interested in it.

Change summary

parsers/src/util/macro_tests.rs | 17 +++++++++++++++++
xso-proc/src/compound.rs        |  6 +++++-
xso/ChangeLog                   |  5 +++++
3 files changed, 27 insertions(+), 1 deletion(-)

Detailed changes

parsers/src/util/macro_tests.rs 🔗

@@ -139,6 +139,23 @@ fn empty_unexpected_attribute() {
     }
 }
 
+#[test]
+#[cfg_attr(
+    feature = "disable-validation",
+    should_panic = "unexpected result: Ok("
+)]
+fn empty_ignores_xml_lang() {
+    #[allow(unused_imports)]
+    use core::{
+        option::Option::{None, Some},
+        result::Result::{Err, Ok},
+    };
+    match parse_str::<Empty>("<foo xmlns='urn:example:ns1' xml:lang='bar'/>") {
+        Ok(Empty) => (),
+        other => panic!("unexpected result: {:?}", other),
+    }
+}
+
 #[test]
 #[cfg_attr(
     feature = "disable-validation",

xso-proc/src/compound.rs 🔗

@@ -396,7 +396,11 @@ impl Compound {
             }
         }
 
-        let mut discard_attr = TokenStream::default();
+        // We always implicitly discard the `xml:lang` attribute. Its
+        // processing is handled using the `#[xml(language)]` meta.
+        let mut discard_attr = quote! {
+            let _ = #attrs.remove(::xso::exports::rxml::Namespace::xml(), "lang");
+        };
         for (xml_namespace, xml_name) in self.discard_attr.iter() {
             let xml_namespace = match xml_namespace {
                 Some(v) => v.to_token_stream(),

xso/ChangeLog 🔗

@@ -12,6 +12,11 @@ Version NEXT:
 
         This change overall allows for more flexibility in the implementation
         of text codecs.
+      - `xml:lang` attributes are now silently discarded during
+        deserialisation unless captured by `#[xml(attribute = "xml:lang")]` or
+        equivalent. This is because `xml:lang` is special as per
+        XML 1.0 § 2.12 and it is generally preferable to allow it to occur
+        anywhere in the document.
     * Added
       - Support for child elements in derive macros. Child elements may also
         be wrapped in Option or Box or in containers like Vec or HashSet.