From ccd46047befb2c2bb8f7bcd72b74193bfeac06b3 Mon Sep 17 00:00:00 2001 From: Paul Fariello Date: Mon, 15 Apr 2024 16:19:24 +0200 Subject: [PATCH] Add OOB --- parsers/src/lib.rs | 3 +++ parsers/src/ns.rs | 3 +++ parsers/src/oob.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 parsers/src/oob.rs diff --git a/parsers/src/lib.rs b/parsers/src/lib.rs index bb6bacf7..094c098e 100644 --- a/parsers/src/lib.rs +++ b/parsers/src/lib.rs @@ -87,6 +87,9 @@ pub mod rsm; /// XEP-0060: Publish-Subscribe pub mod pubsub; +/// XEP-0066: OOB +pub mod oob; + /// XEP-0071: XHTML-IM pub mod xhtml; diff --git a/parsers/src/ns.rs b/parsers/src/ns.rs index 23de46d6..48d1e10e 100644 --- a/parsers/src/ns.rs +++ b/parsers/src/ns.rs @@ -63,6 +63,9 @@ pub const PUBSUB_OWNER: &str = "http://jabber.org/protocol/pubsub#owner"; /// XEP-0060: Publish-Subscribe node configuration pub const PUBSUB_CONFIGURE: &str = "http://jabber.org/protocol/pubsub#node_config"; +/// XEP-0066: Out of Band Data +pub const OOB: &str = "jabber:x:oob"; + /// XEP-0071: XHTML-IM pub const XHTML_IM: &str = "http://jabber.org/protocol/xhtml-im"; /// XEP-0071: XHTML-IM diff --git a/parsers/src/oob.rs b/parsers/src/oob.rs new file mode 100644 index 00000000..5d5b7b2f --- /dev/null +++ b/parsers/src/oob.rs @@ -0,0 +1,67 @@ +// Copyright (c) 2024 Paul Fariello +// +// 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 crate::message::MessagePayload; + +generate_element!( + /// Defines associated out of band url. + Oob, "x", OOB, + children: [ + /// The associated URL. + url: Required = ("url", OOB) => String, + /// An optionnal description of the out of band data. + desc: Option = ("desc", OOB) => String, + ] +); + +impl MessagePayload for Oob {} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::error::Error; + use crate::Element; + + #[cfg(target_pointer_width = "32")] + #[test] + fn test_size() { + assert_size!(Oob, 24); + } + + #[cfg(target_pointer_width = "64")] + #[test] + fn test_size() { + assert_size!(Oob, 48); + } + + #[test] + fn test_simple() { + let elem: Element = "http://example.org" + .parse() + .unwrap(); + Oob::try_from(elem).unwrap(); + } + + #[test] + fn test_with_desc() { + let elem: Element = + "http://example.orgExample website" + .parse() + .unwrap(); + Oob::try_from(elem).unwrap(); + } + + #[test] + fn test_invalid_child() { + let elem: Element = "".parse().unwrap(); + let error = Oob::try_from(elem).unwrap_err(); + let message = match error { + Error::ParseError(string) => string, + _ => panic!(), + }; + assert_eq!(message, "Missing child url in x element."); + } +}