rust/hedgewars-server/src/protocol/parser.rs
author unc0rr
Sun, 16 Dec 2018 00:12:29 +0100
changeset 14462 98ef2913ec73
parent 14420 06672690d71b
child 14780 09d46ab83361
permissions -rw-r--r--
Apply rustfmt to all files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     1
/** The parsers for the chat and multiplayer protocol. The main parser is `message`.
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     2
 * # Protocol
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     3
 * All messages consist of `\n`-separated strings. The end of a message is
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     4
 * indicated by a double newline - `\n\n`.
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     5
 *
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     6
 * For example, a nullary command like PING will be actually sent as `PING\n\n`.
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     7
 * A unary command, such as `START_GAME nick` will be actually sent as `START_GAME\nnick\n\n`.
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
     8
 */
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
     9
use nom::*;
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    10
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
    11
use super::messages::{HWProtocolMessage, HWProtocolMessage::*};
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
    12
use crate::server::coretypes::{GameCfg, HedgehogInfo, TeamInfo, VoteType, MAX_HEDGEHOGS_PER_TEAM};
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
    13
use std::{ops::Range, str, str::FromStr};
13801
59ea2403f62d move everything test related into test cfg
alfadur
parents: 13800
diff changeset
    14
#[cfg(test)]
13810
0463a4221327 cleanup crate imports
alfadur
parents: 13806
diff changeset
    15
use {
0463a4221327 cleanup crate imports
alfadur
parents: 13806
diff changeset
    16
    super::test::gen_proto_msg,
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
    17
    proptest::{proptest, proptest_helper},
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    18
};
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
    19
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    20
named!(end_of_message, tag!("\n\n"));
12147
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12145
diff changeset
    21
named!(str_line<&[u8],   &str>, map_res!(not_line_ending, str::from_utf8));
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12145
diff changeset
    22
named!(  a_line<&[u8], String>, map!(str_line, String::from));
13533
c8b626b0a3ad Implement save/delete commands
alfadur
parents: 13529
diff changeset
    23
named!(cmd_arg<&[u8], String>,
c8b626b0a3ad Implement save/delete commands
alfadur
parents: 13529
diff changeset
    24
    map!(map_res!(take_until_either!(" \n"), str::from_utf8), String::from));
12147
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12145
diff changeset
    25
named!( u8_line<&[u8],     u8>, map_res!(str_line, FromStr::from_str));
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13483
diff changeset
    26
named!(u16_line<&[u8],    u16>, map_res!(str_line, FromStr::from_str));
12147
4d7d41be1993 Start refactoring path from getting message from client to reacting to it
unc0rr
parents: 12145
diff changeset
    27
named!(u32_line<&[u8],    u32>, map_res!(str_line, FromStr::from_str));
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    28
named!(yes_no_line<&[u8], bool>, alt!(
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    29
      do_parse!(tag_no_case!("YES") >> (true))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    30
    | do_parse!(tag_no_case!("NO") >> (false))));
13443
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    31
named!(opt_param<&[u8], Option<String> >, alt!(
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    32
      do_parse!(peek!(tag!("\n\n")) >> (None))
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    33
    | do_parse!(tag!("\n") >> s: str_line >> (Some(s.to_string())))));
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
    34
named!(spaces<&[u8], &[u8]>, preceded!(tag!(" "), eat_separator!(" ")));
13443
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    35
named!(opt_space_param<&[u8], Option<String> >, alt!(
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    36
      do_parse!(peek!(tag!("\n\n")) >> (None))
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
    37
    | do_parse!(spaces >> s: str_line >> (Some(s.to_string())))));
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    38
named!(hog_line<&[u8], HedgehogInfo>,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    39
    do_parse!(name: str_line >> eol >> hat: str_line >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    40
        (HedgehogInfo{name: name.to_string(), hat: hat.to_string()})));
13800
e335daaa77a9 Add hogs per team named constant that absolutely no one asked for
alfadur
parents: 13671
diff changeset
    41
named!(_8_hogs<&[u8], [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize]>,
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    42
    do_parse!(h1: hog_line >> eol >> h2: hog_line >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    43
              h3: hog_line >> eol >> h4: hog_line >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    44
              h5: hog_line >> eol >> h6: hog_line >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    45
              h7: hog_line >> eol >> h8: hog_line >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
    46
              ([h1, h2, h3, h4, h5, h6, h7, h8])));
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    47
named!(voting<&[u8], VoteType>, alt!(
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    48
      do_parse!(tag_no_case!("KICK") >> spaces >> n: a_line >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    49
        (VoteType::Kick(n)))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    50
    | do_parse!(tag_no_case!("MAP") >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    51
        n: opt!(preceded!(spaces, a_line)) >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    52
        (VoteType::Map(n)))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    53
    | do_parse!(tag_no_case!("PAUSE") >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    54
        (VoteType::Pause))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    55
    | do_parse!(tag_no_case!("NEWSEED") >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    56
        (VoteType::NewSeed))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    57
    | do_parse!(tag_no_case!("HEDGEHOGS") >> spaces >> n: u8_line >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
    58
        (VoteType::HedgehogsPerTeam(n)))));
12139
109e6765b1fc Optional parameters parsing function
unc0rr
parents: 12138
diff changeset
    59
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
    60
/** Recognizes messages which do not take any parameters */
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    61
named!(basic_message<&[u8], HWProtocolMessage>, alt!(
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    62
      do_parse!(tag!("PING") >> (Ping))
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    63
    | do_parse!(tag!("PONG") >> (Pong))
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    64
    | do_parse!(tag!("LIST") >> (List))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    65
    | do_parse!(tag!("BANLIST")        >> (BanList))
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    66
    | do_parse!(tag!("GET_SERVER_VAR") >> (GetServerVar))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    67
    | do_parse!(tag!("TOGGLE_READY")   >> (ToggleReady))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    68
    | do_parse!(tag!("START_GAME")     >> (StartGame))
13671
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13533
diff changeset
    69
    | do_parse!(tag!("ROUNDFINISHED")  >> _m: opt_param >> (RoundFinished))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    70
    | do_parse!(tag!("TOGGLE_RESTRICT_JOINS")  >> (ToggleRestrictJoin))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    71
    | do_parse!(tag!("TOGGLE_RESTRICT_TEAMS")  >> (ToggleRestrictTeams))
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    72
    | do_parse!(tag!("TOGGLE_REGISTERED_ONLY") >> (ToggleRegisteredOnly))
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    73
));
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    74
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
    75
/** Recognizes messages which take exactly one parameter */
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
    76
named!(one_param_message<&[u8], HWProtocolMessage>, alt!(
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    77
      do_parse!(tag!("NICK")    >> eol >> n: a_line >> (Nick(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    78
    | do_parse!(tag!("INFO")    >> eol >> n: a_line >> (Info(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    79
    | do_parse!(tag!("CHAT")    >> eol >> m: a_line >> (Chat(m)))
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
    80
    | do_parse!(tag!("PART")    >> msg: opt_param   >> (Part(msg)))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    81
    | do_parse!(tag!("FOLLOW")  >> eol >> n: a_line >> (Follow(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    82
    | do_parse!(tag!("KICK")    >> eol >> n: a_line >> (Kick(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    83
    | do_parse!(tag!("UNBAN")   >> eol >> n: a_line >> (Unban(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    84
    | do_parse!(tag!("EM")      >> eol >> m: a_line >> (EngineMessage(m)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    85
    | do_parse!(tag!("TEAMCHAT")    >> eol >> m: a_line >> (TeamChat(m)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    86
    | do_parse!(tag!("ROOM_NAME")   >> eol >> n: a_line >> (RoomName(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    87
    | do_parse!(tag!("REMOVE_TEAM") >> eol >> n: a_line >> (RemoveTeam(n)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    88
13525
1ee192f13456 Better packing for clients
alfadur
parents: 13483
diff changeset
    89
    | do_parse!(tag!("PROTO")   >> eol >> d: u16_line >> (Proto(d)))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    90
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    91
    | do_parse!(tag!("QUIT")   >> msg: opt_param >> (Quit(msg)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    92
));
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    93
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
    94
/** Recognizes messages preceded with CMD */
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    95
named!(cmd_message<&[u8], HWProtocolMessage>, preceded!(tag!("CMD\n"), alt!(
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    96
      do_parse!(tag_no_case!("STATS") >> (Stats))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    97
    | do_parse!(tag_no_case!("FIX")   >> (Fix))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
    98
    | do_parse!(tag_no_case!("UNFIX") >> (Unfix))
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
    99
    | do_parse!(tag_no_case!("RESTART_SERVER") >> spaces >> tag!("YES") >> (RestartServer))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   100
    | do_parse!(tag_no_case!("REGISTERED_ONLY") >> (ToggleServerRegisteredOnly))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   101
    | do_parse!(tag_no_case!("SUPER_POWER")     >> (SuperPower))
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   102
    | do_parse!(tag_no_case!("PART")     >> m: opt_space_param >> (Part(m)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   103
    | do_parse!(tag_no_case!("QUIT")     >> m: opt_space_param >> (Quit(m)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   104
    | do_parse!(tag_no_case!("DELEGATE") >> spaces >> n: a_line  >> (Delegate(n)))
13533
c8b626b0a3ad Implement save/delete commands
alfadur
parents: 13529
diff changeset
   105
    | do_parse!(tag_no_case!("SAVE")     >> spaces >> n: cmd_arg >> spaces >> l: cmd_arg >> (Save(n, l)))
c8b626b0a3ad Implement save/delete commands
alfadur
parents: 13529
diff changeset
   106
    | do_parse!(tag_no_case!("DELETE")   >> spaces >> n: a_line  >> (Delete(n)))
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   107
    | do_parse!(tag_no_case!("SAVEROOM") >> spaces >> r: a_line  >> (SaveRoom(r)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   108
    | do_parse!(tag_no_case!("LOADROOM") >> spaces >> r: a_line  >> (LoadRoom(r)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   109
    | do_parse!(tag_no_case!("GLOBAL")   >> spaces >> m: a_line  >> (Global(m)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   110
    | do_parse!(tag_no_case!("WATCH")    >> spaces >> i: a_line  >> (Watch(i)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   111
    | do_parse!(tag_no_case!("GREETING") >> spaces >> m: a_line  >> (Greeting(m)))
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
   112
    | do_parse!(tag_no_case!("VOTE")     >> spaces >> m: yes_no_line >> (Vote(m)))
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
   113
    | do_parse!(tag_no_case!("FORCE")    >> spaces >> m: yes_no_line >> (ForceVote(m)))
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   114
    | do_parse!(tag_no_case!("INFO")     >> spaces >> n: a_line  >> (Info(n)))
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   115
    | do_parse!(tag_no_case!("MAXTEAMS") >> spaces >> n: u8_line >> (MaxTeams(n)))
13483
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
   116
    | do_parse!(tag_no_case!("CALLVOTE") >>
d79795acaa73 Mostly implement voting
alfadur
parents: 13446
diff changeset
   117
        v: opt!(preceded!(spaces, voting)) >> (CallVote(v)))
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   118
    | do_parse!(
13437
ee3fa3b8809d Fix cmd parsing & update tests
alfadur
parents: 13436
diff changeset
   119
        tag_no_case!("RND") >> alt!(spaces | peek!(end_of_message)) >>
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   120
        v: str_line >>
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   121
        (Rnd(v.split_whitespace().map(String::from).collect())))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   122
)));
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   123
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   124
named!(complex_message<&[u8], HWProtocolMessage>, alt!(
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   125
      do_parse!(tag!("PASSWORD")  >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   126
                    p: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   127
                    s: a_line     >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   128
                    (Password(p, s)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   129
    | do_parse!(tag!("CHECKER")   >> eol >>
13803
4664da990556 Add official server feature to cargo
alfadur
parents: 13801
diff changeset
   130
                    i: u16_line   >> eol >>
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   131
                    n: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   132
                    p: a_line     >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   133
                    (Checker(i, n, p)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   134
    | do_parse!(tag!("CREATE_ROOM") >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   135
                    n: a_line       >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   136
                    p: opt_param    >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   137
                    (CreateRoom(n, p)))
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   138
    | do_parse!(tag!("JOIN_ROOM")   >> eol >>
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   139
                    n: a_line       >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   140
                    p: opt_param    >>
13421
cdf69667593b partial room implementation
alfadur
parents: 13124
diff changeset
   141
                    (JoinRoom(n, p)))
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   142
    | do_parse!(tag!("ADD_TEAM")    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   143
                    name: a_line    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   144
                    color: u8_line  >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   145
                    grave: a_line   >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   146
                    fort: a_line    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   147
                    voice_pack: a_line >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   148
                    flag: a_line    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   149
                    difficulty: u8_line >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   150
                    hedgehogs: _8_hogs >>
13529
5359ff75da3a indulge clippy
alfadur
parents: 13525
diff changeset
   151
                    (AddTeam(Box::new(TeamInfo{
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   152
                        name, color, grave, fort,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   153
                        voice_pack, flag, difficulty,
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   154
                        hedgehogs, hedgehogs_number: 0
13529
5359ff75da3a indulge clippy
alfadur
parents: 13525
diff changeset
   155
                     }))))
13424
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   156
    | do_parse!(tag!("HH_NUM")    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   157
                    n: a_line     >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   158
                    c: u8_line    >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   159
                    (SetHedgehogsNumber(n, c)))
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   160
    | do_parse!(tag!("TEAM_COLOR")    >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   161
                    n: a_line     >> eol >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   162
                    c: u8_line    >>
81e0ed105f5d implementation of team related messages
alfadur
parents: 13421
diff changeset
   163
                    (SetTeamColor(n, c)))
12140
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   164
    | do_parse!(tag!("BAN")    >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   165
                    n: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   166
                    r: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   167
                    t: u32_line   >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   168
                    (Ban(n, r, t)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   169
    | do_parse!(tag!("BAN_IP")    >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   170
                    n: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   171
                    r: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   172
                    t: u32_line   >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   173
                    (BanIP(n, r, t)))
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   174
    | do_parse!(tag!("BAN_NICK")    >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   175
                    n: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   176
                    r: a_line     >> eol >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   177
                    t: u32_line   >>
23ee939ba66a Add more messages to the parser
unc0rr
parents: 12139
diff changeset
   178
                    (BanNick(n, r, t)))
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   179
));
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   180
13427
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   181
named!(cfg_message<&[u8], HWProtocolMessage>, preceded!(tag!("CFG\n"), map!(alt!(
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   182
      do_parse!(tag!("THEME")    >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   183
                name: a_line     >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   184
                (GameCfg::Theme(name)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   185
    | do_parse!(tag!("SCRIPT")   >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   186
                name: a_line     >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   187
                (GameCfg::Script(name)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   188
    | do_parse!(tag!("AMMO")     >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   189
                name: a_line     >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   190
                value: opt_param >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   191
                (GameCfg::Ammo(name, value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   192
    | do_parse!(tag!("SCHEME")   >> eol >>
13446
d47514fd6c6a Fix scheme config parsing
alfadur
parents: 13443
diff changeset
   193
                name: a_line     >>
d47514fd6c6a Fix scheme config parsing
alfadur
parents: 13443
diff changeset
   194
                values: opt!(preceded!(eol, separated_list!(eol, a_line))) >>
14355
31717e1436cd recruit some newly stabilized functions
alfadur
parents: 13810
diff changeset
   195
                (GameCfg::Scheme(name, values.unwrap_or_default())))
13427
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   196
    | do_parse!(tag!("FEATURE_SIZE") >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   197
                value: u32_line    >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   198
                (GameCfg::FeatureSize(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   199
    | do_parse!(tag!("MAP")      >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   200
                value: a_line    >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   201
                (GameCfg::MapType(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   202
    | do_parse!(tag!("MAPGEN")   >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   203
                value: u32_line  >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   204
                (GameCfg::MapGenerator(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   205
    | do_parse!(tag!("MAZE_SIZE") >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   206
                value: u32_line   >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   207
                (GameCfg::MazeSize(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   208
    | do_parse!(tag!("SEED")     >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   209
                value: a_line    >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   210
                (GameCfg::Seed(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   211
    | do_parse!(tag!("TEMPLATE") >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   212
                value: u32_line  >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   213
                (GameCfg::Template(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   214
    | do_parse!(tag!("DRAWNMAP") >> eol >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   215
                value: a_line    >>
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   216
                (GameCfg::DrawnMap(value)))
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   217
), Cfg)));
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   218
12142
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   219
named!(malformed_message<&[u8], HWProtocolMessage>,
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   220
    do_parse!(separated_list!(eol, a_line) >> (Malformed)));
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   221
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   222
named!(empty_message<&[u8], HWProtocolMessage>,
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   223
    do_parse!(alt!(end_of_message | eol) >> (Empty)));
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   224
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   225
named!(message<&[u8], HWProtocolMessage>, alt!(terminated!(
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   226
    alt!(
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   227
          basic_message
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   228
        | one_param_message
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   229
        | cmd_message
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   230
        | complex_message
13427
5fb27f94fc3b Implement game config messages
alfadur
parents: 13424
diff changeset
   231
        | cfg_message
12142
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   232
        ), end_of_message
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   233
    )
12145
7e259e47eb0d Fix malformed messages parsing
unc0rr
parents: 12142
diff changeset
   234
    | terminated!(malformed_message, end_of_message)
12142
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   235
    | empty_message
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   236
    )
193dfdcb0620 - Use logging facilities instead of plain println!
unc0rr
parents: 12141
diff changeset
   237
);
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   238
12141
e25a82ce2374 - Render messages to string
unc0rr
parents: 12140
diff changeset
   239
named!(pub extract_messages<&[u8], Vec<HWProtocolMessage> >, many0!(complete!(message)));
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   240
13801
59ea2403f62d move everything test related into test cfg
alfadur
parents: 13800
diff changeset
   241
#[cfg(test)]
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   242
proptest! {
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   243
    #[test]
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   244
    fn is_parser_composition_idempotent(ref msg in gen_proto_msg()) {
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   245
        println!("!! Msg: {:?}, Bytes: {:?} !!", msg, msg.to_raw_protocol().as_bytes());
13443
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
   246
        assert_eq!(message(msg.to_raw_protocol().as_bytes()), Ok((&b""[..], msg.clone())))
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   247
    }
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   248
}
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   249
12138
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   250
#[test]
81df2e1f9ae9 Some parsing using nom
unc0rr
parents:
diff changeset
   251
fn parse_test() {
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   252
    assert_eq!(message(b"PING\n\n"), Ok((&b""[..], Ping)));
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   253
    assert_eq!(message(b"START_GAME\n\n"), Ok((&b""[..], StartGame)));
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   254
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   255
        message(b"NICK\nit's me\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   256
        Ok((&b""[..], Nick("it's me".to_string())))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   257
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   258
    assert_eq!(message(b"PROTO\n51\n\n"), Ok((&b""[..], Proto(51))));
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   259
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   260
        message(b"QUIT\nbye-bye\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   261
        Ok((&b""[..], Quit(Some("bye-bye".to_string()))))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   262
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   263
    assert_eq!(message(b"QUIT\n\n"), Ok((&b""[..], Quit(None))));
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   264
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   265
        message(b"CMD\nwatch demo\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   266
        Ok((&b""[..], Watch("demo".to_string())))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   267
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   268
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   269
        message(b"BAN\nme\nbad\n77\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   270
        Ok((&b""[..], Ban("me".to_string(), "bad".to_string(), 77)))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   271
    );
12141
e25a82ce2374 - Render messages to string
unc0rr
parents: 12140
diff changeset
   272
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   273
    assert_eq!(message(b"CMD\nPART\n\n"), Ok((&b""[..], Part(None))));
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   274
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   275
        message(b"CMD\nPART _msg_\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   276
        Ok((&b""[..], Part(Some("_msg_".to_string()))))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   277
    );
13124
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12147
diff changeset
   278
13443
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
   279
    assert_eq!(message(b"CMD\nRND\n\n"), Ok((&b""[..], Rnd(vec![]))));
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   280
    assert_eq!(
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   281
        message(b"CMD\nRND A B\n\n"),
13443
da71e0d88a1c update nom
alfadur
parents: 13437
diff changeset
   282
        Ok((&b""[..], Rnd(vec![String::from("A"), String::from("B")])))
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   283
    );
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   284
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   285
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   286
        extract_messages(b"QUIT\n1\n2\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   287
        Ok((&b""[..], vec![Malformed]))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   288
    );
12145
7e259e47eb0d Fix malformed messages parsing
unc0rr
parents: 12142
diff changeset
   289
14462
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   290
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   291
        extract_messages(b"PING\n\nPING\n\nP"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   292
        Ok((&b"P"[..], vec![Ping, Ping]))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   293
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   294
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   295
        extract_messages(b"SING\n\nPING\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   296
        Ok((&b""[..], vec![Malformed, Ping]))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   297
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   298
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   299
        extract_messages(b"\n\n\n\nPING\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   300
        Ok((&b""[..], vec![Empty, Empty, Ping]))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   301
    );
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   302
    assert_eq!(
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   303
        extract_messages(b"\n\n\nPING\n\n"),
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   304
        Ok((&b""[..], vec![Empty, Empty, Ping]))
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14420
diff changeset
   305
    );
13436
6a818f9192f4 Implement parsing for rnd and add a little documentation
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13428
diff changeset
   306
}