From 395b64e64440d1fa908c972168f9803c2494d580 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Thu, 1 Mar 2018 10:08:30 +0100 Subject: [PATCH] Add a parser. --- src/lib.rs | 2 ++ src/ns.rs | 2 ++ src/stream.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 src/stream.rs diff --git a/src/lib.rs b/src/lib.rs index 5fde6358..7d9091b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -56,6 +56,8 @@ pub mod iq; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub mod stanza_error; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core +pub mod stream; +/// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub mod sasl; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub mod bind; diff --git a/src/ns.rs b/src/ns.rs index 9f905e60..af77fe32 100644 --- a/src/ns.rs +++ b/src/ns.rs @@ -10,6 +10,8 @@ pub const JABBER_CLIENT: &str = "jabber:client"; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub const XMPP_STANZAS: &str = "urn:ietf:params:xml:ns:xmpp-stanzas"; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core +pub const STREAM: &str = "http://etherx.jabber.org/streams"; +/// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub const SASL: &str = "urn:ietf:params:xml:ns:xmpp-sasl"; /// RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core pub const BIND: &str = "urn:ietf:params:xml:ns:xmpp-bind"; diff --git a/src/stream.rs b/src/stream.rs new file mode 100644 index 00000000..83335ae2 --- /dev/null +++ b/src/stream.rs @@ -0,0 +1,70 @@ +// Copyright (c) 2018 Emmanuel Gil Peyrot +// +// 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/. + +use try_from::TryFrom; + +use minidom::Element; +use jid::Jid; +use error::Error; +use ns; + +generate_element_with_only_attributes!(Stream, "stream", ns::STREAM, [ + from: Option = "from" => optional, + to: Option = "to" => optional, + id: Option = "id" => optional, + version: Option = "version" => optional, + xml_lang: Option = "xml:lang" => optional, +]); + +impl Stream { + pub fn new(to: Jid) -> Stream { + Stream { + from: None, + to: Some(to), + id: None, + version: Some(String::from("1.0")), + xml_lang: None, + } + } + + pub fn with_from(mut self, from: Jid) -> Stream { + self.from = Some(from); + self + } + + pub fn with_id(mut self, id: String) -> Stream { + self.id = Some(id); + self + } + + pub fn with_lang(mut self, xml_lang: String) -> Stream { + self.xml_lang = Some(xml_lang); + self + } + + pub fn is_version(&self, version: &str) -> bool { + match self.version { + None => false, + Some(ref self_version) => self_version == &String::from(version), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_simple() { + let elem: Element = "".parse().unwrap(); + let stream = Stream::try_from(elem).unwrap(); + assert_eq!(stream.from, Some(Jid::domain("some-server.example"))); + assert_eq!(stream.to, None); + assert_eq!(stream.id, Some(String::from("abc"))); + assert_eq!(stream.version, Some(String::from("1.0"))); + assert_eq!(stream.xml_lang, Some(String::from("en"))); + } +}