diff options
Diffstat (limited to 'stanza/src/client/mod.rs')
-rw-r--r-- | stanza/src/client/mod.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/stanza/src/client/mod.rs b/stanza/src/client/mod.rs new file mode 100644 index 0000000..2b063d6 --- /dev/null +++ b/stanza/src/client/mod.rs @@ -0,0 +1,61 @@ +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"; + +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()), + } + } +} |