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 { 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(), } } }