delay.rs

  1// Copyright (c) 2017 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
  2//
  3// This Source Code Form is subject to the terms of the Mozilla Public
  4// License, v. 2.0. If a copy of the MPL was not distributed with this
  5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6
  7use minidom::{Element, IntoElements};
  8use minidom::convert::ElementEmitter;
  9
 10use error::Error;
 11
 12use ns;
 13
 14#[derive(Debug, Clone)]
 15pub struct Delay {
 16    pub from: Option<String>,
 17    pub stamp: String,
 18    pub data: Option<String>,
 19}
 20
 21pub fn parse_delay(root: &Element) -> Result<Delay, Error> {
 22    if !root.is("delay", ns::DELAY) {
 23        return Err(Error::ParseError("This is not a delay element."));
 24    }
 25    for _ in root.children() {
 26        return Err(Error::ParseError("Unknown child in delay element."));
 27    }
 28    let from = root.attr("from").and_then(|value| value.parse().ok());
 29    let stamp = root.attr("stamp").ok_or(Error::ParseError("Mandatory argument 'stamp' not present in delay element."))?.to_owned();
 30    let data = match root.text().as_ref() {
 31        "" => None,
 32        text => Some(text.to_owned()),
 33    };
 34    Ok(Delay {
 35        from: from,
 36        stamp: stamp,
 37        data: data,
 38    })
 39}
 40
 41pub fn serialise(delay: &Delay) -> Element {
 42    Element::builder("delay")
 43            .ns(ns::DELAY)
 44            .attr("from", delay.from.clone())
 45            .attr("stamp", delay.stamp.clone())
 46            .append(delay.data.clone())
 47            .build()
 48}
 49
 50impl IntoElements for Delay {
 51    fn into_elements(self, emitter: &mut ElementEmitter) {
 52        let elem = serialise(&self);
 53        emitter.append_child(elem)
 54    }
 55}
 56
 57#[cfg(test)]
 58mod tests {
 59    use minidom::Element;
 60    use error::Error;
 61    use delay;
 62
 63    #[test]
 64    fn test_simple() {
 65        let elem: Element = "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>".parse().unwrap();
 66        let delay = delay::parse_delay(&elem).unwrap();
 67        assert_eq!(delay.from, Some(String::from("capulet.com")));
 68        assert_eq!(delay.stamp, "2002-09-10T23:08:25Z");
 69        assert_eq!(delay.data, None);
 70    }
 71
 72    #[test]
 73    fn test_unknown() {
 74        let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
 75        let error = delay::parse_delay(&elem).unwrap_err();
 76        let message = match error {
 77            Error::ParseError(string) => string,
 78            _ => panic!(),
 79        };
 80        assert_eq!(message, "This is not a delay element.");
 81    }
 82
 83    #[test]
 84    fn test_invalid_child() {
 85        let elem: Element = "<delay xmlns='urn:xmpp:delay'><coucou/></delay>".parse().unwrap();
 86        let error = delay::parse_delay(&elem).unwrap_err();
 87        let message = match error {
 88            Error::ParseError(string) => string,
 89            _ => panic!(),
 90        };
 91        assert_eq!(message, "Unknown child in delay element.");
 92    }
 93
 94    #[test]
 95    fn test_serialise() {
 96        let elem: Element = "<delay xmlns='urn:xmpp:delay' stamp='2002-09-10T23:08:25Z'/>".parse().unwrap();
 97        let delay = delay::Delay {
 98            from: None,
 99            stamp: "2002-09-10T23:08:25Z".to_owned(),
100            data: None,
101        };
102        let elem2 = delay::serialise(&delay);
103        assert_eq!(elem, elem2);
104    }
105
106    #[test]
107    fn test_serialise_data() {
108        let elem: Element = "<delay xmlns='urn:xmpp:delay' from='juliet@example.org' stamp='2002-09-10T23:08:25Z'>Reason</delay>".parse().unwrap();
109        let delay = delay::Delay {
110            from: Some(String::from("juliet@example.org")),
111            stamp: "2002-09-10T23:08:25Z".to_owned(),
112            data: Some(String::from("Reason")),
113        };
114        let elem2 = delay::serialise(&delay);
115        assert_eq!(elem, elem2);
116    }
117}