receipts.rs

 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}