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}