1use minidom::Element;
2
3use error::Error;
4
5use ns;
6
7#[derive(Debug, Clone)]
8pub enum Receipt {
9 Request,
10 Received(String),
11}
12
13pub fn parse_receipt(root: &Element) -> Result<Receipt, Error> {
14 for _ in root.children() {
15 return Err(Error::ParseError("Unknown child in receipt element."));
16 }
17 if root.is("request", ns::RECEIPTS) {
18 Ok(Receipt::Request)
19 } else if root.is("received", ns::RECEIPTS) {
20 let id = root.attr("id").unwrap_or("").to_owned();
21 Ok(Receipt::Received(id))
22 } else {
23 Err(Error::ParseError("This is not a receipt element."))
24 }
25}
26
27pub fn serialise(receipt: &Receipt) -> Element {
28 match *receipt {
29 Receipt::Request => Element::builder("request")
30 .ns(ns::RECEIPTS)
31 .build(),
32 Receipt::Received(ref id) => Element::builder("received")
33 .ns(ns::RECEIPTS)
34 .attr("id", id.clone())
35 .build(),
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use minidom::Element;
42 //use error::Error;
43 use receipts;
44 use ns;
45
46 #[test]
47 fn test_simple() {
48 let elem: Element = "<request xmlns='urn:xmpp:receipts'/>".parse().unwrap();
49 receipts::parse_receipt(&elem).unwrap();
50
51 let elem: Element = "<received xmlns='urn:xmpp:receipts'/>".parse().unwrap();
52 receipts::parse_receipt(&elem).unwrap();
53
54 let elem: Element = "<received xmlns='urn:xmpp:receipts' id='coucou'/>".parse().unwrap();
55 receipts::parse_receipt(&elem).unwrap();
56 }
57
58 #[test]
59 fn test_serialise() {
60 let receipt = receipts::Receipt::Request;
61 let elem = receipts::serialise(&receipt);
62 assert!(elem.is("request", ns::RECEIPTS));
63
64 let receipt = receipts::Receipt::Received("coucou".to_owned());
65 let elem = receipts::serialise(&receipt);
66 assert!(elem.is("received", ns::RECEIPTS));
67 assert_eq!(elem.attr("id"), Some("coucou"));
68 }
69}