97 r: a_line >> eol >> |
97 r: a_line >> eol >> |
98 t: u32_line >> |
98 t: u32_line >> |
99 (BanNick(n, r, t))) |
99 (BanNick(n, r, t))) |
100 )); |
100 )); |
101 |
101 |
102 named!(message<&[u8], HWProtocolMessage>, terminated!(alt!( |
102 named!(malformed_message<&[u8], HWProtocolMessage>, |
103 basic_message |
103 do_parse!(separated_list!(eol, a_line) >> (Malformed))); |
104 | one_param_message |
104 |
105 | cmd_message |
105 named!(empty_message<&[u8], HWProtocolMessage>, |
106 | complex_message |
106 do_parse!(alt!(end_of_message | eol) >> (Empty))); |
107 ), end_of_message |
107 |
108 )); |
108 named!(message<&[u8], HWProtocolMessage>, alt!(terminated!( |
|
109 alt!( |
|
110 basic_message |
|
111 | one_param_message |
|
112 | cmd_message |
|
113 | complex_message |
|
114 | malformed_message |
|
115 ), end_of_message |
|
116 ) |
|
117 | empty_message |
|
118 ) |
|
119 ); |
109 |
120 |
110 named!(pub extract_messages<&[u8], Vec<HWProtocolMessage> >, many0!(complete!(message))); |
121 named!(pub extract_messages<&[u8], Vec<HWProtocolMessage> >, many0!(complete!(message))); |
111 |
122 |
112 #[test] |
123 #[test] |
113 fn parse_test() { |
124 fn parse_test() { |
118 assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye")))); |
129 assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye")))); |
119 assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None))); |
130 assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None))); |
120 assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo"))); |
131 assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo"))); |
121 assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me", "bad", 77))); |
132 assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me", "bad", 77))); |
122 |
133 |
123 assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), IResult::Done(&b"P"[..], vec![Ping, Ping])); |
134 assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), IResult::Done(&b"P"[..], vec![Ping, Ping])); |
|
135 assert_eq!(extract_messages(b"SING\n\nPING\n\n"), IResult::Done(&b""[..], vec![Malformed, Ping])); |
|
136 assert_eq!(extract_messages(b"\n\n\n\nPING\n\n"), IResult::Done(&b""[..], vec![Empty, Empty, Ping])); |
|
137 assert_eq!(extract_messages(b"\n\n\nPING\n\n"), IResult::Done(&b""[..], vec![Empty, Empty, Ping])); |
124 } |
138 } |