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}