gameServer2/src/protocol/parser.rs
changeset 13478 d79795acaa73
parent 13441 d47514fd6c6a
child 13520 1ee192f13456
equal deleted inserted replaced
13477:f748a72432f2 13478:d79795acaa73
    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 )));