luz/src/stanza/client/mod.rs

49 lines
1.4 KiB
Rust
Raw Normal View History

use iq::Iq;
use message::Message;
use peanuts::{
element::{FromElement, IntoElement},
DeserializeError,
};
use presence::Presence;
use super::stream::{self, Error as StreamError};
2024-12-02 21:50:15 +00:00
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<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 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(),
}
}
}