diff options
Diffstat (limited to 'stanza/src/xep_0060/event.rs')
-rw-r--r-- | stanza/src/xep_0060/event.rs | 89 |
1 files changed, 52 insertions, 37 deletions
diff --git a/stanza/src/xep_0060/event.rs b/stanza/src/xep_0060/event.rs index d2c150a..3cb124b 100644 --- a/stanza/src/xep_0060/event.rs +++ b/stanza/src/xep_0060/event.rs @@ -2,12 +2,11 @@ use std::str::FromStr; use chrono::{DateTime, Utc}; use jid::JID; -use peanuts::{ - element::{FromElement, IntoElement}, - DeserializeError, Element, -}; +use peanuts::{DeserializeError, Element, FromElement, IntoElement}; use crate::xep_0004::X; +#[cfg(feature = "xep_0084")] +use crate::xep_0084; #[cfg(feature = "xep_0172")] use crate::xep_0172::{self, Nick}; @@ -24,7 +23,7 @@ pub enum Event { } impl FromElement for Event { - fn from_element(mut element: peanuts::Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: peanuts::Element) -> peanuts::DeserializeResult<Self> { element.check_name("event")?; element.check_namespace(XMLNS)?; @@ -47,7 +46,7 @@ impl FromElement for Event { } impl IntoElement for Event { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { let builder = Element::builder("event", Some(XMLNS)); match self { @@ -68,7 +67,7 @@ pub struct Collection { } impl FromElement for Collection { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("node")?; element.check_namespace(XMLNS)?; @@ -80,7 +79,7 @@ impl FromElement for Collection { } impl IntoElement for Collection { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("collection", Some(XMLNS)) .push_attribute_opt("node", self.node.clone()) .push_child(self.r#type.clone()) @@ -94,7 +93,7 @@ pub enum CollectionType { } impl FromElement for CollectionType { - fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(element: Element) -> peanuts::DeserializeResult<Self> { match element.identify() { (Some(XMLNS), "associate") => { Ok(CollectionType::Associate(Associate::from_element(element)?)) @@ -108,7 +107,7 @@ impl FromElement for CollectionType { } impl IntoElement for CollectionType { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { match self { CollectionType::Associate(associate) => associate.builder(), CollectionType::Disassociate(disassociate) => disassociate.builder(), @@ -122,7 +121,7 @@ pub struct Associate { } impl FromElement for Associate { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("associate")?; element.check_namespace(XMLNS)?; @@ -133,7 +132,7 @@ impl FromElement for Associate { } impl IntoElement for Associate { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("associate", Some(XMLNS)).push_attribute("node", self.node.clone()) } } @@ -144,7 +143,7 @@ pub struct Disassociate { } impl FromElement for Disassociate { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("disassociate")?; element.check_namespace(XMLNS)?; @@ -155,7 +154,7 @@ impl FromElement for Disassociate { } impl IntoElement for Disassociate { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("disassociate", Some(XMLNS)).push_attribute("node", self.node.clone()) } } @@ -167,7 +166,7 @@ pub struct Configuration { } impl FromElement for Configuration { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("configuration")?; element.check_namespace(XMLNS)?; @@ -183,7 +182,7 @@ impl FromElement for Configuration { } impl IntoElement for Configuration { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("configuration", Some(XMLNS)) .push_attribute_opt("node", self.node.clone()) .push_child_opt(self.configuration.clone()) @@ -197,7 +196,7 @@ pub struct Delete { } impl FromElement for Delete { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("delete")?; element.check_namespace(XMLNS)?; @@ -210,7 +209,7 @@ impl FromElement for Delete { } impl IntoElement for Delete { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("delete", Some(XMLNS)) .push_attribute("node", self.node.clone()) .push_child_opt(self.redirect.clone()) @@ -219,12 +218,12 @@ impl IntoElement for Delete { #[derive(Clone, Debug)] pub struct Items { - node: String, - items: ItemsType, + pub node: String, + pub items: ItemsType, } impl FromElement for Items { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("items")?; element.check_namespace(XMLNS)?; @@ -241,7 +240,7 @@ impl FromElement for Items { } impl IntoElement for Items { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { let builder = Element::builder("items", Some(XMLNS)).push_attribute("node", self.node.clone()); @@ -260,13 +259,13 @@ pub enum ItemsType { #[derive(Clone, Debug)] pub struct Item { - id: Option<String>, - publisher: Option<String>, - item: Option<Content>, + pub id: Option<String>, + pub publisher: Option<String>, + pub item: Option<Content>, } impl FromElement for Item { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("item")?; element.check_namespace(XMLNS)?; @@ -284,7 +283,7 @@ impl FromElement for Item { } impl IntoElement for Item { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("item", Some(XMLNS)) .push_attribute_opt("id", self.id.clone()) .push_attribute_opt("publisher", self.publisher.clone()) @@ -296,24 +295,40 @@ impl IntoElement for Item { pub enum Content { #[cfg(feature = "xep_0172")] Nick(Nick), + #[cfg(feature = "xep_0084")] + AvatarData(xep_0084::Data), + #[cfg(feature = "xep_0084")] + AvatarMetadata(xep_0084::Metadata), Unknown(Element), } impl FromElement for Content { - fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(element: Element) -> peanuts::DeserializeResult<Self> { match element.identify() { #[cfg(feature = "xep_0172")] (Some(xep_0172::XMLNS), "nick") => Ok(Content::Nick(Nick::from_element(element)?)), + #[cfg(feature = "xep_0084")] + (Some(xep_0084::data::XMLNS), "data") => { + Ok(Content::AvatarData(xep_0084::Data::from_element(element)?)) + } + #[cfg(feature = "xep_0084")] + (Some(xep_0084::metadata::XMLNS), "metadata") => Ok(Content::AvatarMetadata( + xep_0084::Metadata::from_element(element)?, + )), _ => Ok(Self::Unknown(element)), } } } impl IntoElement for Content { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { match self { #[cfg(feature = "xep_0172")] Content::Nick(nick) => nick.builder(), + #[cfg(feature = "xep_0084")] + Content::AvatarData(data) => data.builder(), + #[cfg(feature = "xep_0084")] + Content::AvatarMetadata(metadata) => metadata.builder(), Content::Unknown(_e) => panic!("unknown content cannot be serialized"), } } @@ -325,7 +340,7 @@ pub struct Purge { } impl FromElement for Purge { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("purge")?; element.check_namespace(XMLNS)?; @@ -336,7 +351,7 @@ impl FromElement for Purge { } impl IntoElement for Purge { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("purge", Some(XMLNS)).push_attribute("node", self.node.clone()) } } @@ -347,7 +362,7 @@ pub struct Redirect { } impl FromElement for Redirect { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("redirect")?; element.check_namespace(XMLNS)?; @@ -358,7 +373,7 @@ impl FromElement for Redirect { } impl IntoElement for Redirect { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("redirect", Some(XMLNS)).push_attribute("uri", self.uri.clone()) } } @@ -369,7 +384,7 @@ pub struct Retract { } impl FromElement for Retract { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("retract")?; element.check_namespace(XMLNS)?; @@ -380,7 +395,7 @@ impl FromElement for Retract { } impl IntoElement for Retract { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("retract", Some(XMLNS)).push_attribute("id", self.id.clone()) } } @@ -395,7 +410,7 @@ pub struct Subscription { } impl FromElement for Subscription { - fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { + fn from_element(mut element: Element) -> peanuts::DeserializeResult<Self> { element.check_name("subscription")?; element.check_namespace(XMLNS)?; @@ -416,7 +431,7 @@ impl FromElement for Subscription { } impl IntoElement for Subscription { - fn builder(&self) -> peanuts::element::ElementBuilder { + fn builder(&self) -> peanuts::ElementBuilder { Element::builder("subscription", Some(XMLNS)) .push_attribute_opt("expiry", self.expiry) .push_attribute("jid", self.jid.clone()) |