gameServer2/src/protocol/parser.rs
changeset 12142 4d7d41be1993
parent 12140 7e259e47eb0d
child 13119 1e39b8749072
equal deleted inserted replaced
12141:78925eff02c2 12142:4d7d41be1993
     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]));