parsers: add support for <optional/> in stream management feature

Jonas Schรคfer created

Change summary

parsers/ChangeLog    |  2 ++
parsers/src/sasl2.rs |  2 +-
parsers/src/sm.rs    | 19 ++++++++++++++++---
3 files changed, 19 insertions(+), 4 deletions(-)

Detailed changes

parsers/ChangeLog ๐Ÿ”—

@@ -30,6 +30,8 @@ XXXX-YY-ZZ RELEASER <admin@example.com>
         - SASL Channel-Binding Type Capability (XEP-0440)
         - Stream Limits Advertisement (XEP-0478)
         - RFC 6120 stream errors
+    * Improvements:
+        - Add support for `<optional/> in XEP-0198 feature advertisment
 
 Version 0.21.0:
 2024-07-25 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

parsers/src/sasl2.rs ๐Ÿ”—

@@ -268,7 +268,7 @@ mod tests {
 
         let inline = auth.inline.unwrap();
         assert_eq!(inline.bind2.unwrap().inline_features.len(), 0);
-        assert_eq!(inline.sm.unwrap(), StreamManagement);
+        assert_eq!(inline.sm.unwrap(), StreamManagement { optional: None });
         assert_eq!(inline.payloads.len(), 0);
     }
 

parsers/src/sm.rs ๐Ÿ”—

@@ -140,11 +140,22 @@ pub struct Resumed {
     pub previd: StreamId,
 }
 
+/// Marker whose presence indicates that negotiating stream management is
+/// optional.
+#[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
+#[xml(namespace = ns::SM, name = "optional")]
+pub struct Optional;
+
 // TODO: add support for optional and required.
 /// Represents availability of Stream Management in `<stream:features/>`.
 #[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
 #[xml(namespace = ns::SM, name = "sm")]
-pub struct StreamManagement;
+pub struct StreamManagement {
+    // TODO: replace with #[xml(flag)] once we have it.
+    /// `<optional/>` flag.
+    #[xml(child(default))]
+    pub optional: Option<Optional>,
+}
 
 #[cfg(test)]
 mod tests {
@@ -163,7 +174,8 @@ mod tests {
         assert_size!(R, 0);
         assert_size!(Resume, 16);
         assert_size!(Resumed, 16);
-        assert_size!(StreamManagement, 0);
+        assert_size!(StreamManagement, 1);
+        assert_size!(Optional, 0);
     }
 
     #[cfg(target_pointer_width = "64")]
@@ -178,7 +190,8 @@ mod tests {
         assert_size!(R, 0);
         assert_size!(Resume, 32);
         assert_size!(Resumed, 32);
-        assert_size!(StreamManagement, 0);
+        assert_size!(StreamManagement, 1);
+        assert_size!(Optional, 0);
     }
 
     #[test]