forwarding.rs

 1use minidom::{Element, IntoElements};
 2use minidom::convert::ElementEmitter;
 3
 4use error::Error;
 5
 6use delay;
 7use message;
 8
 9use ns;
10
11#[derive(Debug, Clone)]
12pub struct Forwarded {
13    pub delay: Option<delay::Delay>,
14    // XXX: really?  Option?
15    pub stanza: Option<message::Message>,
16}
17
18pub fn parse_forwarded(root: &Element) -> Result<Forwarded, Error> {
19    if !root.is("forwarded", ns::FORWARD) {
20        return Err(Error::ParseError("This is not a forwarded element."));
21    }
22    let mut delay = None;
23    let mut stanza = None;
24    for child in root.children() {
25        if child.is("delay", ns::DELAY) {
26            delay = Some(delay::parse_delay(child)?);
27        } else if child.is("message", ns::JABBER_CLIENT) {
28            stanza = Some(message::parse_message(child)?);
29        // TODO: also handle the five other possibilities.
30        } else {
31            return Err(Error::ParseError("Unknown child in forwarded element."));
32        }
33    }
34    Ok(Forwarded {
35        delay: delay,
36        stanza: stanza,
37    })
38}
39
40pub fn serialise(forwarded: &Forwarded) -> Element {
41    Element::builder("forwarded")
42            .ns(ns::FORWARD)
43            .append(forwarded.delay.clone())
44            .append(forwarded.stanza.clone())
45            .build()
46}
47
48#[cfg(test)]
49mod tests {
50    use minidom::Element;
51    use error::Error;
52    use forwarding;
53
54    #[test]
55    fn test_simple() {
56        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
57        forwarding::parse_forwarded(&elem).unwrap();
58    }
59
60    #[test]
61    fn test_invalid_child() {
62        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'><coucou/></forwarded>".parse().unwrap();
63        let error = forwarding::parse_forwarded(&elem).unwrap_err();
64        let message = match error {
65            Error::ParseError(string) => string,
66            _ => panic!(),
67        };
68        assert_eq!(message, "Unknown child in forwarded element.");
69    }
70
71    #[test]
72    fn test_serialise() {
73        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
74        let forwarded = forwarding::Forwarded { delay: None, stanza: None };
75        let elem2 = forwarding::serialise(&forwarded);
76        assert_eq!(elem, elem2);
77    }
78}