4 use std::str::FromStr; |
4 use std::str::FromStr; |
5 use super::messages::HWProtocolMessage; |
5 use super::messages::HWProtocolMessage; |
6 use super::messages::HWProtocolMessage::*; |
6 use super::messages::HWProtocolMessage::*; |
7 |
7 |
8 named!(end_of_message, tag!("\n\n")); |
8 named!(end_of_message, tag!("\n\n")); |
9 named!(a_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8)); |
9 named!(str_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8)); |
10 named!( u8_line<&[u8], u8>, map_res!(a_line, FromStr::from_str)); |
10 named!( a_line<&[u8], String>, map!(str_line, String::from)); |
11 named!(u32_line<&[u8], u32>, map_res!(a_line, FromStr::from_str)); |
11 named!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); |
12 named!(opt_param<&[u8], Option<&str> >, opt!(flat_map!(preceded!(eol, a_line), non_empty))); |
12 named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); |
|
13 named!(opt_param<&[u8], Option<String> >, opt!(map!(flat_map!(preceded!(eol, str_line), non_empty), String::from))); |
13 |
14 |
14 named!(basic_message<&[u8], HWProtocolMessage>, alt!( |
15 named!(basic_message<&[u8], HWProtocolMessage>, alt!( |
15 do_parse!(tag!("PING") >> (Ping)) |
16 do_parse!(tag!("PING") >> (Ping)) |
16 | do_parse!(tag!("PONG") >> (Pong)) |
17 | do_parse!(tag!("PONG") >> (Pong)) |
17 | do_parse!(tag!("LIST") >> (List)) |
18 | do_parse!(tag!("LIST") >> (List)) |
122 |
123 |
123 #[test] |
124 #[test] |
124 fn parse_test() { |
125 fn parse_test() { |
125 assert_eq!(message(b"PING\n\n"), IResult::Done(&b""[..], Ping)); |
126 assert_eq!(message(b"PING\n\n"), IResult::Done(&b""[..], Ping)); |
126 assert_eq!(message(b"START_GAME\n\n"), IResult::Done(&b""[..], StartGame)); |
127 assert_eq!(message(b"START_GAME\n\n"), IResult::Done(&b""[..], StartGame)); |
127 assert_eq!(message(b"NICK\nit's me\n\n"), IResult::Done(&b""[..], Nick("it's me"))); |
128 assert_eq!(message(b"NICK\nit's me\n\n"), IResult::Done(&b""[..], Nick("it's me".to_string()))); |
128 assert_eq!(message(b"PROTO\n51\n\n"), IResult::Done(&b""[..], Proto(51))); |
129 assert_eq!(message(b"PROTO\n51\n\n"), IResult::Done(&b""[..], Proto(51))); |
129 assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye")))); |
130 assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye".to_string())))); |
130 assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None))); |
131 assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None))); |
131 assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo"))); |
132 assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo".to_string()))); |
132 assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me", "bad", 77))); |
133 assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me".to_string(), "bad".to_string(), 77))); |
133 |
134 |
134 assert_eq!(extract_messages(b"QUIT\n1\n2\n\n"), IResult::Done(&b""[..], vec![Malformed])); |
135 assert_eq!(extract_messages(b"QUIT\n1\n2\n\n"), IResult::Done(&b""[..], vec![Malformed])); |
135 |
136 |
136 assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), IResult::Done(&b"P"[..], vec![Ping, Ping])); |
137 assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), IResult::Done(&b"P"[..], vec![Ping, Ping])); |
137 assert_eq!(extract_messages(b"SING\n\nPING\n\n"), IResult::Done(&b""[..], vec![Malformed, Ping])); |
138 assert_eq!(extract_messages(b"SING\n\nPING\n\n"), IResult::Done(&b""[..], vec![Malformed, Ping])); |