Add a new CSI parser (XEP-0352).

Emmanuel Gil Peyrot created

Change summary

ChangeLog  |  1 
src/csi.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib.rs |  3 ++
src/ns.rs  |  3 ++
4 files changed, 66 insertions(+)

Detailed changes

ChangeLog 🔗

@@ -1,6 +1,7 @@
 Version NEXT:
 DATE  Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
     * New parsers/serialisers:
+        - Client State Indication (XEP-0352)
         - OpenPGP for XMPP (XEP-0373)
     * Breaking changes:
         - Presence constructors now take Into<Jid> and assume Some.

src/csi.rs 🔗

@@ -0,0 +1,59 @@
+// Copyright (c) 2019 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+generate_empty_element!(
+    /// Stream:feature sent by the server to advertise it supports CSI.
+    Feature, "csi", CSI
+);
+
+generate_empty_element!(
+    /// Client indicates it is inactive.
+    Inactive, "inactive", CSI
+);
+
+generate_empty_element!(
+    /// Client indicates it is active again.
+    Active, "active", CSI
+);
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use minidom::Element;
+    use std::convert::TryFrom;
+    use crate::ns;
+
+    #[test]
+    fn test_size() {
+        assert_size!(Feature, 0);
+        assert_size!(Inactive, 0);
+        assert_size!(Active, 0);
+    }
+
+    #[test]
+    fn parsing() {
+        let elem: Element = "<csi xmlns='urn:xmpp:csi:0'/>".parse().unwrap();
+        Feature::try_from(elem).unwrap();
+
+        let elem: Element = "<inactive xmlns='urn:xmpp:csi:0'/>".parse().unwrap();
+        Inactive::try_from(elem).unwrap();
+
+        let elem: Element = "<active xmlns='urn:xmpp:csi:0'/>".parse().unwrap();
+        Active::try_from(elem).unwrap();
+    }
+
+    #[test]
+    fn serialising() {
+        let elem: Element = Feature.into();
+        assert!(elem.is("csi", ns::CSI));
+
+        let elem: Element = Inactive.into();
+        assert!(elem.is("inactive", ns::CSI));
+
+        let elem: Element = Active.into();
+        assert!(elem.is("active", ns::CSI));
+    }
+}

src/lib.rs 🔗

@@ -177,6 +177,9 @@ pub mod idle;
 /// XEP-0320: Use of DTLS-SRTP in Jingle Sessions
 pub mod jingle_dtls_srtp;
 
+/// XEP-0352: Client State Indication
+pub mod csi;
+
 /// XEP-0353: Jingle Message Initiation
 pub mod jingle_message;
 

src/ns.rs 🔗

@@ -182,6 +182,9 @@ pub const IDLE: &str = "urn:xmpp:idle:1";
 /// XEP-0320: Use of DTLS-SRTP in Jingle Sessions
 pub const JINGLE_DTLS: &str = "urn:xmpp:jingle:apps:dtls:0";
 
+/// XEP-0352: Client State Indication
+pub const CSI: &str = "urn:xmpp:csi:0";
+
 /// XEP-0353: Jingle Message Initiation
 pub const JINGLE_MESSAGE: &str = "urn:xmpp:jingle-message:0";