delay.rs

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