diff --git a/parsers/Cargo.toml b/parsers/Cargo.toml index d944668a63061de9993e2f8bb0c80beabe7cc819..21b6007a6166fcfbc5b33ea2a57ed7996044cb95 100644 --- a/parsers/Cargo.toml +++ b/parsers/Cargo.toml @@ -25,8 +25,9 @@ log = { version = "0.4", optional = true } # same repository dependencies jid = { version = "0.12", path = "../jid", features = ["minidom"] } minidom = { version = "0.16", path = "../minidom" } -xso = { version = "0.1", path = "../xso", features = ["macros", "minidom", "panicking-into-impl", "jid", "uuid", "base64"] } +xso = { version = "0.1", path = "../xso", features = ["macros", "minidom", "panicking-into-impl", "jid", "uuid", "base64", "serde_json"] } uuid = { version = "1.9.1", features = ["v4"] } +serde_json = { version = "1.0", default-features = false, features = ["alloc"] } [features] # Build xmpp-parsers to make components instead of clients. diff --git a/parsers/ChangeLog b/parsers/ChangeLog index 570954183c925625de1514eda5ff796c91f6bd4f..cd5d4b54d4b429bbf3df2359e275eff6399134a5 100644 --- a/parsers/ChangeLog +++ b/parsers/ChangeLog @@ -78,6 +78,7 @@ XXXX-YY-ZZ RELEASER - RFC 6120 stream errors - XEP-0045 mediated invites - Push Notifications (XEP-0357) (!543) + - JSON Containers (XEP-0335) (!546) * Improvements: - Add support for ` in XEP-0198 feature advertisment - Add support application-specific error conditions in XEP-0198 diff --git a/parsers/doap.xml b/parsers/doap.xml index bc600aace3ed3290ef122f686f191b964015c915..4c934359c58d5079a02837befd74126072aaa119 100644 --- a/parsers/doap.xml +++ b/parsers/doap.xml @@ -514,6 +514,14 @@ 0.16.0 + + + + complete + 0.1.1 + NEXT + + diff --git a/parsers/src/json_containers.rs b/parsers/src/json_containers.rs new file mode 100644 index 0000000000000000000000000000000000000000..42803379f0cd3a2a1473b1afcf8393dc36de251f --- /dev/null +++ b/parsers/src/json_containers.rs @@ -0,0 +1,62 @@ +// Copyright (c) 2025 Maxime “pep” Buquet +// +// 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::ns; + +use xso::{AsXml, FromXml}; + +/// Structure representing a `` element. +#[derive(FromXml, AsXml, Debug, Clone, PartialEq)] +#[xml(namespace = ns::JSON_CONTAINERS, name = "json")] +pub struct JsonContainer(#[xml(text)] serde_json::Value); + +#[cfg(test)] +mod tests { + use super::*; + use minidom::Element; + + use crate::Error::TextParseError; + use xso::error::FromElementError; + + #[cfg(target_pointer_width = "32")] + #[test] + fn test_size() { + assert_size!(JsonContainer, 16); + } + + #[cfg(target_pointer_width = "64")] + #[test] + fn test_size() { + assert_size!(JsonContainer, 32); + } + + #[test] + fn test_empty() { + let elem: Element = "".parse().unwrap(); + let error = JsonContainer::try_from(elem.clone()).unwrap_err(); + match error { + FromElementError::Invalid(TextParseError(err)) => { + assert_eq!( + err.to_string(), + "EOF while parsing a value at line 1 column 0" + ); + } + _ => panic!(), + } + } + + #[test] + fn test_simple() { + let elem: Element = "{\"a\": 1}" + .parse() + .unwrap(); + let result: serde_json::Value = "{\"a\": 1}".parse().unwrap(); + match JsonContainer::try_from(elem.clone()) { + Ok(json) => assert_eq!(json.0, result), + _ => panic!(), + }; + } +} diff --git a/parsers/src/lib.rs b/parsers/src/lib.rs index 42446bfdd6cfacd47124383b241f00bf9cae65e1..47d1fe63285d0637ee17eba82819039aec103850 100644 --- a/parsers/src/lib.rs +++ b/parsers/src/lib.rs @@ -233,6 +233,9 @@ pub mod jingle_dtls_srtp; /// XEP-0328: JID Prep pub mod jid_prep; +/// XEP-0335: JSON Containers +pub mod json_containers; + /// XEP-0338: Jingle Grouping Framework pub mod jingle_grouping; diff --git a/parsers/src/ns.rs b/parsers/src/ns.rs index 8e85751b79db062aae377102173d8cd4a4789e1a..5dedc3efc879a0f0c7b09c77bb6af87b247f3656 100644 --- a/parsers/src/ns.rs +++ b/parsers/src/ns.rs @@ -225,6 +225,9 @@ pub const JINGLE_DTLS: &str = "urn:xmpp:jingle:apps:dtls:0"; /// XEP-0328: JID Prep pub const JID_PREP: &str = "urn:xmpp:jidprep:0"; +/// XEP-0335: JSON Containers +pub const JSON_CONTAINERS: &str = "urn:xmpp:json:0"; + /// XEP-0338: Jingle Grouping Framework pub const JINGLE_GROUPING: &str = "urn:xmpp:jingle:apps:grouping:0";