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