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


                            



                                                                 

                             

                                


                            
                                                                               






                                                  








                                        



                            
                                                  
                                                            
                                                          





                                                               




                       


                             


                           
                                                                               











                                                  
                                                  





                                                          
use jid::JID;
use peanuts::{Element, FromElement, IntoElement};

#[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::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::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::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::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())
    }
}