xso: offer `is_xml_whitespace` function

Jonas Schäfer created

Change summary

xso-proc/src/compound.rs |  2 +-
xso/src/lib.rs           | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)

Detailed changes

xso-proc/src/compound.rs 🔗

@@ -279,7 +279,7 @@ impl Compound {
             None => quote! {
                 // note: u8::is_ascii_whitespace includes U+000C, which is not
                 // part of XML's white space definition.'
-                if #text.as_bytes().iter().any(|b| *b != b' ' && *b != b'\t' && *b != b'\r' && *b != b'\n') {
+                if !::xso::is_xml_whitespace(#text.as_bytes()) {
                     ::core::result::Result::Err(::xso::error::Error::Other("Unexpected text content".into()))
                 } else {
                     ::core::result::Result::Ok(::core::ops::ControlFlow::Break(

xso/src/lib.rs 🔗

@@ -419,3 +419,13 @@ pub fn from_bytes<T: FromXml>(mut buf: &[u8]) -> Result<T, self::error::Error> {
         rxml::error::XmlError::InvalidEof("while parsing FromXml impl"),
     ))
 }
+
+/// Return true if the string contains exclusively XML whitespace.
+///
+/// XML whitespace is defined as U+0020 (space), U+0009 (tab), U+000a
+/// (newline) and U+000d (carriage return).
+pub fn is_xml_whitespace<T: AsRef<[u8]>>(s: T) -> bool {
+    s.as_ref()
+        .iter()
+        .all(|b| *b == b' ' || *b == b'\t' || *b == b'\r' || *b == b'\n')
+}