gameServer2/src/protocol/parser.rs
changeset 12137 193dfdcb0620
parent 12136 e25a82ce2374
child 12140 7e259e47eb0d
equal deleted inserted replaced
12136:e25a82ce2374 12137:193dfdcb0620
    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 }