diff --git a/src/attention.rs b/src/attention.rs index 2f12545..21f8e0b 100644 --- a/src/attention.rs +++ b/src/attention.rs @@ -4,6 +4,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +use std::convert::TryFrom; + use minidom::Element; use error::Error; @@ -13,38 +15,45 @@ use ns; #[derive(Debug, Clone)] pub struct Attention; -pub fn parse_attention(root: &Element) -> Result { - if !root.is("attention", ns::ATTENTION) { - return Err(Error::ParseError("This is not an attention element.")); +impl<'a> TryFrom<&'a Element> for Attention { + type Error = Error; + + fn try_from(elem: &'a Element) -> Result { + if !elem.is("attention", ns::ATTENTION) { + return Err(Error::ParseError("This is not an attention element.")); + } + for _ in elem.children() { + return Err(Error::ParseError("Unknown child in attention element.")); + } + Ok(Attention) } - for _ in root.children() { - return Err(Error::ParseError("Unknown child in attention element.")); - } - Ok(Attention) } -pub fn serialise(_: &Attention) -> Element { - Element::builder("attention") - .ns(ns::ATTENTION) - .build() +impl<'a> Into for &'a Attention { + fn into(self) -> Element { + Element::builder("attention") + .ns(ns::ATTENTION) + .build() + } } #[cfg(test)] mod tests { + use std::convert::TryFrom; use minidom::Element; use error::Error; - use attention; + use super::Attention; #[test] fn test_simple() { let elem: Element = "".parse().unwrap(); - attention::parse_attention(&elem).unwrap(); + Attention::try_from(&elem).unwrap(); } #[test] fn test_invalid_child() { let elem: Element = "".parse().unwrap(); - let error = attention::parse_attention(&elem).unwrap_err(); + let error = Attention::try_from(&elem).unwrap_err(); let message = match error { Error::ParseError(string) => string, _ => panic!(), @@ -55,8 +64,10 @@ mod tests { #[test] fn test_serialise() { let elem: Element = "".parse().unwrap(); - let attention = attention::Attention; - let elem2 = attention::serialise(&attention); + let attention = Attention; + let elem2: Element = (&attention).into(); + let elem3: Element = (&attention).into(); assert_eq!(elem, elem2); + assert_eq!(elem2, elem3); } } diff --git a/src/lib.rs b/src/lib.rs index 67a335f..3076fcc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +#![feature(try_from)] + extern crate minidom; extern crate jid; extern crate base64; diff --git a/src/message.rs b/src/message.rs index 9d3ea6f..3550e81 100644 --- a/src/message.rs +++ b/src/message.rs @@ -4,6 +4,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +use std::convert::TryFrom; use std::str::FromStr; use minidom::{Element, IntoElements, IntoAttributeValue}; @@ -20,7 +21,7 @@ use stanza_error; use chatstates; use receipts; use delay; -use attention; +use attention::Attention; use message_correct; use eme; @@ -32,7 +33,7 @@ pub enum MessagePayload { ChatState(chatstates::ChatState), Receipt(receipts::Receipt), Delay(delay::Delay), - Attention(attention::Attention), + Attention(Attention), MessageCorrect(message_correct::Replace), ExplicitMessageEncryption(eme::ExplicitMessageEncryption), } @@ -121,7 +122,7 @@ pub fn parse_message(root: &Element) -> Result { Some(MessagePayload::Receipt(receipt)) } else if let Ok(delay) = delay::parse_delay(elem) { Some(MessagePayload::Delay(delay)) - } else if let Ok(attention) = attention::parse_attention(elem) { + } else if let Ok(attention) = Attention::try_from(elem) { Some(MessagePayload::Attention(attention)) } else if let Ok(replace) = message_correct::parse_replace(elem) { Some(MessagePayload::MessageCorrect(replace)) @@ -148,7 +149,7 @@ pub fn serialise_payload(payload: &MessagePayload) -> Element { match *payload { MessagePayload::Body(ref body) => body::serialise(body), MessagePayload::StanzaError(ref stanza_error) => stanza_error::serialise(stanza_error), - MessagePayload::Attention(ref attention) => attention::serialise(attention), + MessagePayload::Attention(ref attention) => attention.into(), MessagePayload::ChatState(ref chatstate) => chatstates::serialise(chatstate), MessagePayload::Receipt(ref receipt) => receipts::serialise(receipt), MessagePayload::Delay(ref delay) => delay::serialise(delay),