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}