From f7b88569987026bcfec6132ca97b1d8122f44edd Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Tue, 1 Apr 2025 20:42:51 +0100 Subject: feat(stanza): xep-0059: result set management --- stanza/src/xep_0030/info.rs | 19 +++++++++++++++++-- stanza/src/xep_0030/items.rs | 24 +++++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) (limited to 'stanza/src/xep_0030') diff --git a/stanza/src/xep_0030/info.rs b/stanza/src/xep_0030/info.rs index 589fd08..94cbabb 100644 --- a/stanza/src/xep_0030/info.rs +++ b/stanza/src/xep_0030/info.rs @@ -3,6 +3,9 @@ use peanuts::{ DeserializeError, Element, }; +#[cfg(feature = "xep_0059")] +use crate::xep_0059::Set; + pub const XMLNS: &str = "http://jabber.org/protocol/disco#info"; #[derive(Debug, Clone)] @@ -10,6 +13,8 @@ pub struct Query { pub node: Option, pub features: Vec, pub identities: Vec, + #[cfg(feature = "xep_0059")] + pub set: Option, } impl FromElement for Query { @@ -22,20 +27,30 @@ impl FromElement for Query { let features = element.children()?; let identities = element.children()?; + #[cfg(feature = "xep_0059")] + let set = element.child_opt()?; + Ok(Self { node, features, identities, + #[cfg(feature = "xep_0059")] + set, }) } } impl IntoElement for Query { fn builder(&self) -> peanuts::element::ElementBuilder { - Element::builder("query", Some(XMLNS)) + let builder = Element::builder("query", Some(XMLNS)) .push_attribute_opt("node", self.node.clone()) .push_children(self.features.clone()) - .push_children(self.identities.clone()) + .push_children(self.identities.clone()); + + #[cfg(feature = "xep_0059")] + let builder = builder.push_child_opt(self.set.clone()); + + builder } } diff --git a/stanza/src/xep_0030/items.rs b/stanza/src/xep_0030/items.rs index 7af2bbf..471f3e1 100644 --- a/stanza/src/xep_0030/items.rs +++ b/stanza/src/xep_0030/items.rs @@ -4,12 +4,17 @@ use peanuts::{ Element, }; +#[cfg(feature = "xep_0059")] +use crate::xep_0059::Set; + pub const XMLNS: &str = "http://jabber.org/protocol/disco#items"; #[derive(Debug, Clone)] pub struct Query { pub node: Option, pub items: Vec, + #[cfg(feature = "xep_0059")] + pub set: Option, } impl FromElement for Query { @@ -21,15 +26,28 @@ impl FromElement for Query { let items = element.pop_children()?; - Ok(Self { node, items }) + #[cfg(feature = "xep_0059")] + let set = element.child_opt()?; + + Ok(Self { + node, + items, + #[cfg(feature = "xep_0059")] + set, + }) } } impl IntoElement for Query { fn builder(&self) -> peanuts::element::ElementBuilder { - Element::builder("query", Some(XMLNS)) + let builder = Element::builder("query", Some(XMLNS)) .push_attribute_opt("node", self.node.clone()) - .push_children(self.items.clone()) + .push_children(self.items.clone()); + + #[cfg(feature = "xep_0059")] + let builder = builder.push_child_opt(self.set.clone()); + + builder } } -- cgit