64 lines
2.1 KiB
Rust
64 lines
2.1 KiB
Rust
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<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()),
|
|
}
|
|
}
|
|
}
|