delay.rs

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