16 use super::{ |
16 use super::{ |
17 messages::{HWProtocolMessage, HWProtocolMessage::*}, |
17 messages::{HWProtocolMessage, HWProtocolMessage::*}, |
18 test::gen_proto_msg |
18 test::gen_proto_msg |
19 }; |
19 }; |
20 use server::coretypes::{ |
20 use server::coretypes::{ |
21 HedgehogInfo, TeamInfo, GameCfg |
21 HedgehogInfo, TeamInfo, GameCfg, VoteType |
22 }; |
22 }; |
23 |
23 |
24 named!(end_of_message, tag!("\n\n")); |
24 named!(end_of_message, tag!("\n\n")); |
25 named!(str_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8)); |
25 named!(str_line<&[u8], &str>, map_res!(not_line_ending, str::from_utf8)); |
26 named!( a_line<&[u8], String>, map!(str_line, String::from)); |
26 named!( a_line<&[u8], String>, map!(str_line, String::from)); |
27 named!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); |
27 named!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); |
28 named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); |
28 named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); |
|
29 named!(yes_no_line<&[u8], bool>, alt!( |
|
30 do_parse!(tag_no_case!("YES") >> (true)) |
|
31 | do_parse!(tag_no_case!("NO") >> (false)))); |
29 named!(opt_param<&[u8], Option<String> >, alt!( |
32 named!(opt_param<&[u8], Option<String> >, alt!( |
30 do_parse!(peek!(tag!("\n\n")) >> (None)) |
33 do_parse!(peek!(tag!("\n\n")) >> (None)) |
31 | do_parse!(tag!("\n") >> s: str_line >> (Some(s.to_string()))))); |
34 | do_parse!(tag!("\n") >> s: str_line >> (Some(s.to_string()))))); |
32 named!(spaces<&[u8], &[u8]>, preceded!(tag!(" "), eat_separator!(" "))); |
35 named!(spaces<&[u8], &[u8]>, preceded!(tag!(" "), eat_separator!(" "))); |
33 named!(opt_space_param<&[u8], Option<String> >, alt!( |
36 named!(opt_space_param<&[u8], Option<String> >, alt!( |
40 do_parse!(h1: hog_line >> eol >> h2: hog_line >> eol >> |
43 do_parse!(h1: hog_line >> eol >> h2: hog_line >> eol >> |
41 h3: hog_line >> eol >> h4: hog_line >> eol >> |
44 h3: hog_line >> eol >> h4: hog_line >> eol >> |
42 h5: hog_line >> eol >> h6: hog_line >> eol >> |
45 h5: hog_line >> eol >> h6: hog_line >> eol >> |
43 h7: hog_line >> eol >> h8: hog_line >> |
46 h7: hog_line >> eol >> h8: hog_line >> |
44 ([h1, h2, h3, h4, h5, h6, h7, h8]))); |
47 ([h1, h2, h3, h4, h5, h6, h7, h8]))); |
|
48 named!(voting<&[u8], VoteType>, alt!( |
|
49 do_parse!(tag_no_case!("KICK") >> spaces >> n: a_line >> |
|
50 (VoteType::Kick(n))) |
|
51 | do_parse!(tag_no_case!("MAP") >> |
|
52 n: opt!(preceded!(spaces, a_line)) >> |
|
53 (VoteType::Map(n))) |
|
54 | do_parse!(tag_no_case!("PAUSE") >> |
|
55 (VoteType::Pause)) |
|
56 | do_parse!(tag_no_case!("NEWSEED") >> |
|
57 (VoteType::NewSeed)) |
|
58 | do_parse!(tag_no_case!("HEDGEHOGS") >> spaces >> n: u8_line >> |
|
59 (VoteType::HedgehogsPerTeam(n))))); |
45 |
60 |
46 /** Recognizes messages which do not take any parameters */ |
61 /** Recognizes messages which do not take any parameters */ |
47 named!(basic_message<&[u8], HWProtocolMessage>, alt!( |
62 named!(basic_message<&[u8], HWProtocolMessage>, alt!( |
48 do_parse!(tag!("PING") >> (Ping)) |
63 do_parse!(tag!("PING") >> (Ping)) |
49 | do_parse!(tag!("PONG") >> (Pong)) |
64 | do_parse!(tag!("PONG") >> (Pong)) |
92 | do_parse!(tag_no_case!("LOADROOM") >> spaces >> r: a_line >> (LoadRoom(r))) |
107 | do_parse!(tag_no_case!("LOADROOM") >> spaces >> r: a_line >> (LoadRoom(r))) |
93 | do_parse!(tag_no_case!("DELETE") >> spaces >> r: a_line >> (Delete(r))) |
108 | do_parse!(tag_no_case!("DELETE") >> spaces >> r: a_line >> (Delete(r))) |
94 | do_parse!(tag_no_case!("GLOBAL") >> spaces >> m: a_line >> (Global(m))) |
109 | do_parse!(tag_no_case!("GLOBAL") >> spaces >> m: a_line >> (Global(m))) |
95 | do_parse!(tag_no_case!("WATCH") >> spaces >> i: a_line >> (Watch(i))) |
110 | do_parse!(tag_no_case!("WATCH") >> spaces >> i: a_line >> (Watch(i))) |
96 | do_parse!(tag_no_case!("GREETING") >> spaces >> m: a_line >> (Greeting(m))) |
111 | do_parse!(tag_no_case!("GREETING") >> spaces >> m: a_line >> (Greeting(m))) |
97 | do_parse!(tag_no_case!("VOTE") >> spaces >> m: a_line >> (Vote(m))) |
112 | do_parse!(tag_no_case!("VOTE") >> spaces >> m: yes_no_line >> (Vote(m))) |
98 | do_parse!(tag_no_case!("FORCE") >> spaces >> m: a_line >> (ForceVote(m))) |
113 | do_parse!(tag_no_case!("FORCE") >> spaces >> m: yes_no_line >> (ForceVote(m))) |
99 | do_parse!(tag_no_case!("INFO") >> spaces >> n: a_line >> (Info(n))) |
114 | do_parse!(tag_no_case!("INFO") >> spaces >> n: a_line >> (Info(n))) |
100 | do_parse!(tag_no_case!("MAXTEAMS") >> spaces >> n: u8_line >> (MaxTeams(n))) |
115 | do_parse!(tag_no_case!("MAXTEAMS") >> spaces >> n: u8_line >> (MaxTeams(n))) |
|
116 | do_parse!(tag_no_case!("CALLVOTE") >> |
|
117 v: opt!(preceded!(spaces, voting)) >> (CallVote(v))) |
101 | do_parse!( |
118 | do_parse!( |
102 tag_no_case!("RND") >> alt!(spaces | peek!(end_of_message)) >> |
119 tag_no_case!("RND") >> alt!(spaces | peek!(end_of_message)) >> |
103 v: str_line >> |
120 v: str_line >> |
104 (Rnd(v.split_whitespace().map(String::from).collect()))) |
121 (Rnd(v.split_whitespace().map(String::from).collect()))) |
105 ))); |
122 ))); |