use iq::Iq; use message::Message; use peanuts::{ element::{Content, ContentBuilder, FromContent, FromElement, IntoContent, 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"; /// 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 { 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 { 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) => ::builder(message), Stanza::Presence(presence) => ::builder(presence), Stanza::Iq(iq) => ::builder(iq), Stanza::Error(error) => ::builder(error), Stanza::OtherContent(_content) => ContentBuilder::Comment("other-content".to_string()), } } }