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