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









                                                





                                        































                                                                                                
use iq::Iq;
use message::Message;
use peanuts::{
    element::{FromElement, IntoElement},
    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";

pub enum Stanza {
    Message(Message),
    Presence(Presence),
    Iq(Iq),
    Error(StreamError),
}

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 IntoElement for Stanza {
    fn builder(&self) -> peanuts::element::ElementBuilder {
        match self {
            Stanza::Message(message) => message.builder(),
            Stanza::Presence(presence) => presence.builder(),
            Stanza::Iq(iq) => iq.builder(),
            Stanza::Error(error) => error.builder(),
        }
    }
}