forwarding.rs

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