aboutsummaryrefslogblamecommitdiffstats
path: root/stanza/src/client/mod.rs
blob: 1f36dc341bd9007d838828aa51f210a10d73445c (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                     
                                                                              





                                                





                                        
 
                 
                




                       











                                                                                    















                                                                                                

                                                           
                    




                                                                                                   


         
use iq::Iq;
use message::Message;
use peanuts::{
    element::{Content, ContentBuilder, FromContent, FromElement, IntoContent},
    DeserializeError,
};
use presence::Presence;

use super::stream::{self, Error as StreamError};

pub mod error;
pub mod iq;
pub mod message;
pub mod presence;

pub const XMLNS: &str = "jabber:client";

/// TODO: End tag
#[derive(Debug)]
pub enum Stanza {
    Message(Message),
    Presence(Presence),
    Iq(Iq),
    Error(StreamError),
    OtherContent(Content),
}

impl FromContent for Stanza {
    fn from_content(content: Content) -> peanuts::element::DeserializeResult<Self> {
        match content {
            Content::Element(element) => Ok(Stanza::from_element(element)?),
            Content::Text(_) => Ok(Stanza::OtherContent(content)),
            Content::PI => Ok(Stanza::OtherContent(content)),
            Content::Comment(_) => Ok(Stanza::OtherContent(content)),
        }
    }
}

impl FromElement for Stanza {
    fn from_element(element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> {
        match element.identify() {
            (Some(XMLNS), "message") => Ok(Stanza::Message(Message::from_element(element)?)),
            (Some(XMLNS), "presence") => Ok(Stanza::Presence(Presence::from_element(element)?)),
            (Some(XMLNS), "iq") => Ok(Stanza::Iq(Iq::from_element(element)?)),
            (Some(stream::XMLNS), "error") => {
                Ok(Stanza::Error(StreamError::from_element(element)?))
            }
            _ => Err(DeserializeError::UnexpectedElement(element)),
        }
    }
}

impl IntoContent for Stanza {
    fn builder(&self) -> peanuts::element::ContentBuilder {
        match self {
            Stanza::Message(message) => <Message as IntoContent>::builder(message),
            Stanza::Presence(presence) => <Presence as IntoContent>::builder(presence),
            Stanza::Iq(iq) => <Iq as IntoContent>::builder(iq),
            Stanza::Error(error) => <StreamError as IntoContent>::builder(error),
            Stanza::OtherContent(_content) => ContentBuilder::Comment("other-content".to_string()),
        }
    }
}