chatstates.rs

 1use minidom::Element;
 2
 3use error::Error;
 4use super::MessagePayload;
 5
 6use ns::CHATSTATES_NS;
 7
 8#[derive(Debug)]
 9pub enum ChatState {
10    Active,
11    Composing,
12    Gone,
13    Inactive,
14    Paused,
15}
16
17impl MessagePayload for ChatState {}
18
19pub fn parse_chatstate(root: &Element) -> Result<ChatState, Error> {
20    for _ in root.children() {
21        return Err(Error::ParseError("Unknown child in chatstate element."));
22    }
23    if root.is("active", CHATSTATES_NS) {
24        Ok(ChatState::Active)
25    } else if root.is("composing", CHATSTATES_NS) {
26        Ok(ChatState::Composing)
27    } else if root.is("gone", CHATSTATES_NS) {
28        Ok(ChatState::Gone)
29    } else if root.is("inactive", CHATSTATES_NS) {
30        Ok(ChatState::Inactive)
31    } else if root.is("paused", CHATSTATES_NS) {
32        Ok(ChatState::Paused)
33    } else {
34        Err(Error::ParseError("This is not a chatstate element."))
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use minidom::Element;
41    use error::Error;
42    use chatstates;
43
44    #[test]
45    fn test_simple() {
46        let elem: Element = "<active xmlns='http://jabber.org/protocol/chatstates'/>".parse().unwrap();
47        chatstates::parse_chatstate(&elem).unwrap();
48    }
49
50    #[test]
51    fn test_invalid() {
52        let elem: Element = "<coucou xmlns='http://jabber.org/protocol/chatstates'/>".parse().unwrap();
53        let error = chatstates::parse_chatstate(&elem).unwrap_err();
54        let message = match error {
55            Error::ParseError(string) => string,
56            _ => panic!(),
57        };
58        assert_eq!(message, "Unknown chatstate element.");
59    }
60
61    #[test]
62    fn test_invalid_child() {
63        let elem: Element = "<gone xmlns='http://jabber.org/protocol/chatstates'><coucou/></gone>".parse().unwrap();
64        let error = chatstates::parse_chatstate(&elem).unwrap_err();
65        let message = match error {
66            Error::ParseError(string) => string,
67            _ => panic!(),
68        };
69        assert_eq!(message, "Unknown child in chatstate element.");
70    }
71
72    #[test]
73    #[ignore]
74    fn test_invalid_attribute() {
75        let elem: Element = "<inactive xmlns='http://jabber.org/protocol/chatstates' coucou=''/>".parse().unwrap();
76        let error = chatstates::parse_chatstate(&elem).unwrap_err();
77        let message = match error {
78            Error::ParseError(string) => string,
79            _ => panic!(),
80        };
81        assert_eq!(message, "Unknown attribute in chatstate element.");
82    }
83}