12133
|
1 |
use nom::*;
|
|
2 |
|
|
3 |
use std::str;
|
|
4 |
use std::str::FromStr;
|
|
5 |
use super::messages::HWProtocolMessage;
|
|
6 |
use super::messages::HWProtocolMessage::*;
|
|
7 |
|
|
8 |
named!(end_of_message, tag!("\n\n"));
|
|
9 |
named!(a_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8));
|
12135
|
10 |
named!( u8_line<&[u8], u8>, map_res!(a_line, FromStr::from_str));
|
|
11 |
named!(u32_line<&[u8], u32>, map_res!(a_line, FromStr::from_str));
|
12134
|
12 |
named!(opt_param<&[u8], Option<&str> >, opt!(flat_map!(preceded!(eol, a_line), non_empty)));
|
|
13 |
|
12133
|
14 |
named!(basic_message<&[u8], HWProtocolMessage>, alt!(
|
12135
|
15 |
do_parse!(tag!("PING") >> (Ping))
|
12133
|
16 |
| do_parse!(tag!("PONG") >> (Pong))
|
|
17 |
| do_parse!(tag!("LIST") >> (List))
|
12135
|
18 |
| do_parse!(tag!("BANLIST") >> (BanList))
|
12133
|
19 |
| do_parse!(tag!("GET_SERVER_VAR") >> (GetServerVar))
|
12135
|
20 |
| do_parse!(tag!("TOGGLE_READY") >> (ToggleReady))
|
|
21 |
| do_parse!(tag!("START_GAME") >> (StartGame))
|
|
22 |
| do_parse!(tag!("ROUNDFINISHED") >> (RoundFinished))
|
|
23 |
| do_parse!(tag!("TOGGLE_RESTRICT_JOINS") >> (ToggleRestrictJoin))
|
|
24 |
| do_parse!(tag!("TOGGLE_RESTRICT_TEAMS") >> (ToggleRestrictTeams))
|
12133
|
25 |
| do_parse!(tag!("TOGGLE_REGISTERED_ONLY") >> (ToggleRegisteredOnly))
|
|
26 |
));
|
|
27 |
|
|
28 |
named!(one_param_message<&[u8], HWProtocolMessage>, alt!(
|
12135
|
29 |
do_parse!(tag!("NICK") >> eol >> n: a_line >> (Nick(n)))
|
|
30 |
| do_parse!(tag!("INFO") >> eol >> n: a_line >> (Info(n)))
|
|
31 |
| do_parse!(tag!("CHAT") >> eol >> m: a_line >> (Chat(m)))
|
|
32 |
| do_parse!(tag!("FOLLOW") >> eol >> n: a_line >> (Follow(n)))
|
|
33 |
| do_parse!(tag!("KICK") >> eol >> n: a_line >> (Kick(n)))
|
|
34 |
| do_parse!(tag!("UNBAN") >> eol >> n: a_line >> (Unban(n)))
|
|
35 |
| do_parse!(tag!("EM") >> eol >> m: a_line >> (EngineMessage(m)))
|
|
36 |
| do_parse!(tag!("TEAMCHAT") >> eol >> m: a_line >> (TeamChat(m)))
|
|
37 |
| do_parse!(tag!("ROOM_NAME") >> eol >> n: a_line >> (RoomName(n)))
|
|
38 |
| do_parse!(tag!("REMOVE_TEAM") >> eol >> n: a_line >> (RemoveTeam(n)))
|
|
39 |
|
|
40 |
| do_parse!(tag!("PROTO") >> eol >> d: u32_line >> (Proto(d)))
|
|
41 |
|
|
42 |
| do_parse!(tag!("QUIT") >> msg: opt_param >> (Quit(msg)))
|
|
43 |
));
|
|
44 |
|
|
45 |
named!(cmd_message<&[u8], HWProtocolMessage>, preceded!(tag!("CMD\n"), alt!(
|
|
46 |
do_parse!(tag_no_case!("STATS") >> (Stats))
|
|
47 |
| do_parse!(tag_no_case!("FIX") >> (Fix))
|
|
48 |
| do_parse!(tag_no_case!("UNFIX") >> (Unfix))
|
|
49 |
| do_parse!(tag_no_case!("RESTART_SERVER") >> eol >> tag!("YES") >> (RestartServer))
|
|
50 |
| do_parse!(tag_no_case!("REGISTERED_ONLY") >> (ToggleServerRegisteredOnly))
|
|
51 |
| do_parse!(tag_no_case!("SUPER_POWER") >> (SuperPower))
|
|
52 |
| do_parse!(tag_no_case!("PART") >> eol >> m: opt_param >> (Quit(m)))
|
|
53 |
| do_parse!(tag_no_case!("QUIT") >> eol >> m: opt_param >> (Part(m)))
|
|
54 |
| do_parse!(tag_no_case!("DELEGATE") >> eol >> n: a_line >> (Delegate(n)))
|
|
55 |
| do_parse!(tag_no_case!("SAVEROOM") >> eol >> r: a_line >> (SaveRoom(r)))
|
|
56 |
| do_parse!(tag_no_case!("LOADROOM") >> eol >> r: a_line >> (LoadRoom(r)))
|
|
57 |
| do_parse!(tag_no_case!("DELETE") >> eol >> r: a_line >> (Delete(r)))
|
|
58 |
| do_parse!(tag_no_case!("GLOBAL") >> eol >> m: a_line >> (Global(m)))
|
|
59 |
| do_parse!(tag_no_case!("WATCH") >> eol >> i: a_line >> (Watch(i)))
|
|
60 |
| do_parse!(tag_no_case!("GREETING") >> eol >> m: a_line >> (Greeting(m)))
|
|
61 |
| do_parse!(tag_no_case!("VOTE") >> eol >> m: a_line >> (Vote(m)))
|
|
62 |
| do_parse!(tag_no_case!("FORCE") >> eol >> m: a_line >> (ForceVote(m)))
|
|
63 |
| do_parse!(tag_no_case!("INFO") >> eol >> n: a_line >> (Info(n)))
|
|
64 |
| do_parse!(tag_no_case!("MAXTEAMS") >> eol >> n: u8_line >> (MaxTeams(n)))
|
|
65 |
)));
|
|
66 |
|
|
67 |
named!(complex_message<&[u8], HWProtocolMessage>, alt!(
|
|
68 |
do_parse!(tag!("PASSWORD") >> eol >>
|
|
69 |
p: a_line >> eol >>
|
|
70 |
s: a_line >>
|
|
71 |
(Password(p, s)))
|
|
72 |
| do_parse!(tag!("CHECKER") >> eol >>
|
|
73 |
i: u32_line >> eol >>
|
|
74 |
n: a_line >> eol >>
|
|
75 |
p: a_line >>
|
|
76 |
(Checker(i, n, p)))
|
|
77 |
| do_parse!(tag!("CREATE_ROOM") >> eol >>
|
|
78 |
n: a_line >>
|
|
79 |
p: opt_param >>
|
|
80 |
(CreateRoom(n, p)))
|
|
81 |
| do_parse!(tag!("JOIN") >> eol >>
|
|
82 |
n: a_line >>
|
|
83 |
p: opt_param >>
|
|
84 |
(Join(n, p)))
|
|
85 |
| do_parse!(tag!("BAN") >> eol >>
|
|
86 |
n: a_line >> eol >>
|
|
87 |
r: a_line >> eol >>
|
|
88 |
t: u32_line >>
|
|
89 |
(Ban(n, r, t)))
|
|
90 |
| do_parse!(tag!("BAN_IP") >> eol >>
|
|
91 |
n: a_line >> eol >>
|
|
92 |
r: a_line >> eol >>
|
|
93 |
t: u32_line >>
|
|
94 |
(BanIP(n, r, t)))
|
|
95 |
| do_parse!(tag!("BAN_NICK") >> eol >>
|
|
96 |
n: a_line >> eol >>
|
|
97 |
r: a_line >> eol >>
|
|
98 |
t: u32_line >>
|
|
99 |
(BanNick(n, r, t)))
|
12133
|
100 |
));
|
|
101 |
|
|
102 |
named!(message<&[u8],HWProtocolMessage>, terminated!(alt!(
|
12135
|
103 |
basic_message
|
12133
|
104 |
| one_param_message
|
12135
|
105 |
| cmd_message
|
|
106 |
| complex_message
|
|
107 |
), end_of_message
|
|
108 |
));
|
12133
|
109 |
|
|
110 |
|
|
111 |
#[test]
|
|
112 |
fn parse_test() {
|
12134
|
113 |
assert_eq!(message(b"PING\n\n"), IResult::Done(&b""[..], Ping));
|
|
114 |
assert_eq!(message(b"START_GAME\n\n"), IResult::Done(&b""[..], StartGame));
|
12133
|
115 |
assert_eq!(message(b"NICK\nit's me\n\n"), IResult::Done(&b""[..], Nick("it's me")));
|
12134
|
116 |
assert_eq!(message(b"PROTO\n51\n\n"), IResult::Done(&b""[..], Proto(51)));
|
|
117 |
assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye"))));
|
|
118 |
assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None)));
|
12135
|
119 |
assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo")));
|
|
120 |
assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me", "bad", 77)));
|
12133
|
121 |
}
|