1use minidom::{Element, IntoElements};
2use minidom::convert::ElementEmitter;
3
4use error::Error;
5
6use ns;
7
8#[derive(Debug, Clone)]
9pub struct Delay {
10 pub from: Option<String>,
11 pub stamp: String,
12 pub data: Option<String>,
13}
14
15pub fn parse_delay(root: &Element) -> Result<Delay, Error> {
16 if !root.is("delay", ns::DELAY) {
17 return Err(Error::ParseError("This is not a delay element."));
18 }
19 for _ in root.children() {
20 return Err(Error::ParseError("Unknown child in delay element."));
21 }
22 let from = root.attr("from").and_then(|value| value.parse().ok());
23 let stamp = root.attr("stamp").ok_or(Error::ParseError("Mandatory argument 'stamp' not present in delay element."))?.to_owned();
24 let data = match root.text().as_ref() {
25 "" => None,
26 text => Some(text.to_owned()),
27 };
28 Ok(Delay {
29 from: from,
30 stamp: stamp,
31 data: data,
32 })
33}
34
35pub fn serialise(delay: &Delay) -> Element {
36 Element::builder("delay")
37 .ns(ns::DELAY)
38 .attr("from", delay.from.clone())
39 .attr("stamp", delay.stamp.clone())
40 .append(delay.data.clone())
41 .build()
42}
43
44impl IntoElements for Delay {
45 fn into_elements(self, emitter: &mut ElementEmitter) {
46 let elem = serialise(&self);
47 emitter.append_child(elem)
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use minidom::Element;
54 use error::Error;
55 use delay;
56
57 #[test]
58 fn test_simple() {
59 let elem: Element = "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>".parse().unwrap();
60 let delay = delay::parse_delay(&elem).unwrap();
61 assert_eq!(delay.from, Some(String::from("capulet.com")));
62 assert_eq!(delay.stamp, "2002-09-10T23:08:25Z");
63 assert_eq!(delay.data, None);
64 }
65
66 #[test]
67 fn test_unknown() {
68 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
69 let error = delay::parse_delay(&elem).unwrap_err();
70 let message = match error {
71 Error::ParseError(string) => string,
72 _ => panic!(),
73 };
74 assert_eq!(message, "This is not a delay element.");
75 }
76
77 #[test]
78 fn test_invalid_child() {
79 let elem: Element = "<delay xmlns='urn:xmpp:delay'><coucou/></delay>".parse().unwrap();
80 let error = delay::parse_delay(&elem).unwrap_err();
81 let message = match error {
82 Error::ParseError(string) => string,
83 _ => panic!(),
84 };
85 assert_eq!(message, "Unknown child in delay element.");
86 }
87
88 #[test]
89 fn test_serialise() {
90 let elem: Element = "<delay xmlns='urn:xmpp:delay' stamp='2002-09-10T23:08:25Z'/>".parse().unwrap();
91 let delay = delay::Delay {
92 from: None,
93 stamp: "2002-09-10T23:08:25Z".to_owned(),
94 data: None,
95 };
96 let elem2 = delay::serialise(&delay);
97 assert_eq!(elem, elem2);
98 }
99
100 #[test]
101 fn test_serialise_data() {
102 let elem: Element = "<delay xmlns='urn:xmpp:delay' from='juliet@example.org' stamp='2002-09-10T23:08:25Z'>Reason</delay>".parse().unwrap();
103 let delay = delay::Delay {
104 from: Some(String::from("juliet@example.org")),
105 stamp: "2002-09-10T23:08:25Z".to_owned(),
106 data: Some(String::from("Reason")),
107 };
108 let elem2 = delay::serialise(&delay);
109 assert_eq!(elem, elem2);
110 }
111}