aboutsummaryrefslogtreecommitdiffstats
path: root/stanza/src/client/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stanza/src/client/mod.rs')
-rw-r--r--stanza/src/client/mod.rs61
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()),
+ }
+ }
+}