diff options
Diffstat (limited to 'src/stanza/bind.rs')
-rw-r--r-- | src/stanza/bind.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/stanza/bind.rs b/src/stanza/bind.rs index 8b13789..0e67a83 100644 --- a/src/stanza/bind.rs +++ b/src/stanza/bind.rs @@ -1 +1,99 @@ +use peanuts::{ + element::{FromElement, IntoElement}, + Element, +}; +use crate::JID; + +pub const XMLNS: &str = "urn:ietf:params:xml:ns:xmpp-bind"; + +#[derive(Clone)] +pub struct Bind { + pub r#type: Option<BindType>, +} + +impl FromElement for Bind { + fn from_element(mut element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> { + element.check_name("bind"); + element.check_name(XMLNS); + + let r#type = element.pop_child_opt()?; + + Ok(Bind { r#type }) + } +} + +impl IntoElement for Bind { + fn builder(&self) -> peanuts::element::ElementBuilder { + Element::builder("bind", Some(XMLNS)).push_child_opt(self.r#type.clone()) + } +} + +#[derive(Clone)] +pub enum BindType { + Resource(ResourceType), + Jid(FullJidType), +} + +impl FromElement for BindType { + fn from_element(element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> { + match element.identify() { + (Some(XMLNS), "resource") => { + Ok(BindType::Resource(ResourceType::from_element(element)?)) + } + (Some(XMLNS), "jid") => Ok(BindType::Jid(FullJidType::from_element(element)?)), + _ => Err(peanuts::DeserializeError::UnexpectedElement(element)), + } + } +} + +impl IntoElement for BindType { + fn builder(&self) -> peanuts::element::ElementBuilder { + match self { + BindType::Resource(resource_type) => resource_type.builder(), + BindType::Jid(full_jid_type) => full_jid_type.builder(), + } + } +} + +// minLength 8 maxLength 3071 +#[derive(Clone)] +pub struct FullJidType(pub JID); + +impl FromElement for FullJidType { + fn from_element(mut element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> { + element.check_name("jid"); + element.check_namespace(XMLNS); + + let jid = element.pop_value()?; + + Ok(FullJidType(jid)) + } +} + +impl IntoElement for FullJidType { + fn builder(&self) -> peanuts::element::ElementBuilder { + Element::builder("jid", Some(XMLNS)).push_text(self.0.clone()) + } +} + +// minLength 1 maxLength 1023 +#[derive(Clone)] +pub struct ResourceType(pub String); + +impl FromElement for ResourceType { + fn from_element(mut element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> { + element.check_name("resource")?; + element.check_namespace(XMLNS)?; + + let resource = element.pop_value()?; + + Ok(ResourceType(resource)) + } +} + +impl IntoElement for ResourceType { + fn builder(&self) -> peanuts::element::ElementBuilder { + Element::builder("resource", Some(XMLNS)).push_text(self.0.clone()) + } +} |