aboutsummaryrefslogblamecommitdiffstats
path: root/stanza/src/xep_0030/items.rs
blob: 471f3e119289664fb81297542766215367799fca (plain) (tree)
1
2
3
4
5
6
7
8
9





                                        


                            



                                                                 

                             

                                










                                                                                        








                                        




                                                           
                                                            
                                                          





                                                               




                       


                             






















                                                                                        
use jid::JID;
use peanuts::{
    element::{FromElement, IntoElement},
    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<String>,
    pub items: Vec<Item>,
    #[cfg(feature = "xep_0059")]
    pub set: Option<Set>,
}

impl FromElement for Query {
    fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> {
        element.check_name("query")?;
        element.check_namespace(XMLNS)?;

        let node = element.attribute_opt("node")?;

        let items = element.pop_children()?;

        #[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 {
        let builder = Element::builder("query", Some(XMLNS))
            .push_attribute_opt("node", self.node.clone())
            .push_children(self.items.clone());

        #[cfg(feature = "xep_0059")]
        let builder = builder.push_child_opt(self.set.clone());

        builder
    }
}

#[derive(Debug, Clone)]
pub struct Item {
    pub jid: JID,
    pub name: Option<String>,
    pub node: Option<String>,
}

impl FromElement for Item {
    fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> {
        element.check_name("item")?;
        element.check_namespace(XMLNS)?;

        let jid = element.attribute("jid")?;
        let name = element.attribute_opt("name")?;
        let node = element.attribute_opt("node")?;

        Ok(Self { jid, name, node })
    }
}

impl IntoElement for Item {
    fn builder(&self) -> peanuts::element::ElementBuilder {
        Element::builder("item", Some(XMLNS))
            .push_attribute("jid", self.jid.clone())
            .push_attribute_opt("name", self.name.clone())
            .push_attribute_opt("node", self.node.clone())
    }
}