Add a receipts parser.

Emmanuel Gil Peyrot created

Change summary

src/lib.rs      |  4 ++++
src/ns.rs       |  1 +
src/receipts.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 49 insertions(+)

Detailed changes

src/lib.rs 🔗

@@ -12,6 +12,7 @@ pub mod jingle;
 pub mod ping;
 pub mod chatstates;
 pub mod ibb;
+pub mod receipts;
 
 use minidom::Element;
 
@@ -19,6 +20,7 @@ use minidom::Element;
 pub enum MessagePayload {
     Body(body::Body),
     ChatState(chatstates::ChatState),
+    Receipt(receipts::Receipt),
 }
 
 pub fn parse_message_payload(elem: &Element) -> Option<MessagePayload> {
@@ -26,6 +28,8 @@ pub fn parse_message_payload(elem: &Element) -> Option<MessagePayload> {
         Some(MessagePayload::Body(body))
     } else if let Ok(chatstate) = chatstates::parse_chatstate(elem) {
         Some(MessagePayload::ChatState(chatstate))
+    } else if let Ok(receipt) = receipts::parse_receipt(elem) {
+        Some(MessagePayload::Receipt(receipt))
     } else {
         None
     }

src/ns.rs 🔗

@@ -6,3 +6,4 @@ pub const JINGLE_NS: &'static str = "urn:xmpp:jingle:1";
 pub const PING_NS: &'static str = "urn:xmpp:ping";
 pub const CHATSTATES_NS: &'static str = "http://jabber.org/protocol/chatstates";
 pub const IBB_NS: &'static str = "http://jabber.org/protocol/ibb";
+pub const RECEIPTS_NS: &'static str = "urn:xmpp:receipts";

src/receipts.rs 🔗

@@ -0,0 +1,44 @@
+use minidom::Element;
+
+use error::Error;
+
+use ns::RECEIPTS_NS;
+
+#[derive(Debug)]
+pub enum Receipt {
+    Request,
+    Received(String),
+}
+
+pub fn parse_receipt(root: &Element) -> Result<Receipt, Error> {
+    for _ in root.children() {
+        return Err(Error::ParseError("Unknown child in receipt element."));
+    }
+    if root.is("request", RECEIPTS_NS) {
+        Ok(Receipt::Request)
+    } else if root.is("received", RECEIPTS_NS) {
+        let id = root.attr("id").unwrap_or("").to_owned();
+        Ok(Receipt::Received(id))
+    } else {
+        Err(Error::ParseError("This is not a receipt element."))
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use minidom::Element;
+    //use error::Error;
+    use receipts;
+
+    #[test]
+    fn test_simple() {
+        let elem: Element = "<request xmlns='urn:xmpp:receipts'/>".parse().unwrap();
+        receipts::parse_receipt(&elem).unwrap();
+
+        let elem: Element = "<received xmlns='urn:xmpp:receipts'/>".parse().unwrap();
+        receipts::parse_receipt(&elem).unwrap();
+
+        let elem: Element = "<received xmlns='urn:xmpp:receipts' id='coucou'/>".parse().unwrap();
+        receipts::parse_receipt(&elem).unwrap();
+    }
+}