rust/hedgewars-network-protocol/src/types.rs
author unc0rr
Wed, 23 Jun 2021 23:41:51 +0200
changeset 15804 747278149393
child 15830 ea459da15b30
permissions -rw-r--r--
Extract network protocol into a separate crate
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15804
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     1
use serde_derive::{Deserialize, Serialize};
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     2
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     3
pub const MAX_HEDGEHOGS_PER_TEAM: u8 = 8;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     4
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     5
#[derive(PartialEq, Eq, Clone, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     6
pub enum ServerVar {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     7
    MOTDNew(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     8
    MOTDOld(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
     9
    LatestProto(u16),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    10
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    11
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    12
#[derive(PartialEq, Eq, Clone, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    13
pub enum GameCfg {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    14
    FeatureSize(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    15
    MapType(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    16
    MapGenerator(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    17
    MazeSize(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    18
    Seed(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    19
    Template(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    20
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    21
    Ammo(String, Option<String>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    22
    Scheme(String, Vec<String>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    23
    Script(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    24
    Theme(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    25
    DrawnMap(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    26
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    27
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    28
#[derive(PartialEq, Eq, Clone, Debug, Default)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    29
pub struct TeamInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    30
    pub owner: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    31
    pub name: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    32
    pub color: u8,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    33
    pub grave: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    34
    pub fort: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    35
    pub voice_pack: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    36
    pub flag: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    37
    pub difficulty: u8,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    38
    pub hedgehogs_number: u8,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    39
    pub hedgehogs: [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize],
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    40
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    41
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    42
#[derive(PartialEq, Eq, Clone, Debug, Default)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    43
pub struct HedgehogInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    44
    pub name: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    45
    pub hat: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    46
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    47
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    48
#[derive(Clone, Serialize, Deserialize, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    49
pub struct Ammo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    50
    pub name: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    51
    pub settings: Option<String>,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    52
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    53
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    54
#[derive(Clone, Serialize, Deserialize, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    55
pub struct Scheme {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    56
    pub name: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    57
    pub settings: Vec<String>,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    58
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    59
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    60
#[derive(Clone, Serialize, Deserialize, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    61
pub struct RoomConfig {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    62
    pub feature_size: u32,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    63
    pub map_type: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    64
    pub map_generator: u32,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    65
    pub maze_size: u32,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    66
    pub seed: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    67
    pub template: u32,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    68
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    69
    pub ammo: Ammo,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    70
    pub scheme: Scheme,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    71
    pub script: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    72
    pub theme: String,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    73
    pub drawn_map: Option<String>,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    74
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    75
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    76
impl RoomConfig {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    77
    pub fn new() -> RoomConfig {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    78
        RoomConfig {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    79
            feature_size: 12,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    80
            map_type: "+rnd+".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    81
            map_generator: 0,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    82
            maze_size: 0,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    83
            seed: "seed".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    84
            template: 0,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    85
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    86
            ammo: Ammo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    87
                name: "Default".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    88
                settings: None,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    89
            },
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    90
            scheme: Scheme {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    91
                name: "Default".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    92
                settings: Vec::new(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    93
            },
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    94
            script: "Normal".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    95
            theme: "\u{1f994}".to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    96
            drawn_map: None,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    97
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    98
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
    99
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   100
    pub fn set_config(&mut self, cfg: GameCfg) {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   101
        match cfg {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   102
            GameCfg::FeatureSize(s) => self.feature_size = s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   103
            GameCfg::MapType(t) => self.map_type = t,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   104
            GameCfg::MapGenerator(g) => self.map_generator = g,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   105
            GameCfg::MazeSize(s) => self.maze_size = s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   106
            GameCfg::Seed(s) => self.seed = s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   107
            GameCfg::Template(t) => self.template = t,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   108
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   109
            GameCfg::Ammo(n, s) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   110
                self.ammo = Ammo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   111
                    name: n,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   112
                    settings: s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   113
                }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   114
            }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   115
            GameCfg::Scheme(n, s) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   116
                self.scheme = Scheme {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   117
                    name: n,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   118
                    settings: s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   119
                }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   120
            }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   121
            GameCfg::Script(s) => self.script = s,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   122
            GameCfg::Theme(t) => self.theme = t,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   123
            GameCfg::DrawnMap(m) => self.drawn_map = Some(m),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   124
        };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   125
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   126
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   127
    pub fn to_map_config(&self) -> Vec<String> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   128
        vec![
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   129
            self.feature_size.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   130
            self.map_type.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   131
            self.map_generator.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   132
            self.maze_size.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   133
            self.seed.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   134
            self.template.to_string(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   135
        ]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   136
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   137
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   138
    pub fn to_game_config(&self) -> Vec<GameCfg> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   139
        use GameCfg::*;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   140
        let mut v = vec![
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   141
            Ammo(self.ammo.name.to_string(), self.ammo.settings.clone()),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   142
            Scheme(self.scheme.name.to_string(), self.scheme.settings.clone()),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   143
            Script(self.script.to_string()),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   144
            Theme(self.theme.to_string()),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   145
        ];
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   146
        if let Some(ref m) = self.drawn_map {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   147
            v.push(DrawnMap(m.to_string()))
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   148
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   149
        v
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   150
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   151
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   152
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   153
#[derive(PartialEq, Eq, Clone, Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   154
pub enum VoteType {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   155
    Kick(String),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   156
    Map(Option<String>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   157
    Pause,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   158
    NewSeed,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   159
    HedgehogsPerTeam(u8),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   160
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   161
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   162
pub struct Vote {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   163
    pub is_pro: bool,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   164
    pub is_forced: bool,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   165
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   166
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   167
//#[cfg(test)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   168
#[macro_use]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   169
pub mod testing {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   170
    use crate::types::ServerVar::*;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   171
    use crate::types::*;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   172
    use proptest::{
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   173
        arbitrary::{any, Arbitrary},
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   174
        strategy::{BoxedStrategy, Just, Strategy},
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   175
    };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   176
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   177
    // Due to inability to define From between Options
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   178
    pub trait Into2<T>: Sized {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   179
        fn into2(self) -> T;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   180
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   181
    impl<T> Into2<T> for T {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   182
        fn into2(self) -> T {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   183
            self
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   184
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   185
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   186
    impl Into2<Vec<String>> for Vec<Ascii> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   187
        fn into2(self) -> Vec<String> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   188
            self.into_iter().map(|x| x.0).collect()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   189
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   190
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   191
    impl Into2<String> for Ascii {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   192
        fn into2(self) -> String {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   193
            self.0
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   194
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   195
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   196
    impl Into2<Option<String>> for Option<Ascii> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   197
        fn into2(self) -> Option<String> {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   198
            self.map(|x| x.0)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   199
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   200
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   201
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   202
    #[macro_export]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   203
    macro_rules! proto_msg_case {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   204
        ($val: ident()) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   205
            Just($val)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   206
        };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   207
        ($val: ident($arg: ty)) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   208
            any::<$arg>().prop_map(|v| $val(v.into2()))
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   209
        };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   210
        ($val: ident($arg1: ty, $arg2: ty)) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   211
            any::<($arg1, $arg2)>().prop_map(|v| $val(v.0.into2(), v.1.into2()))
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   212
        };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   213
        ($val: ident($arg1: ty, $arg2: ty, $arg3: ty)) => {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   214
            any::<($arg1, $arg2, $arg3)>().prop_map(|v| $val(v.0.into2(), v.1.into2(), v.2.into2()))
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   215
        };
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   216
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   217
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   218
    #[macro_export]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   219
    macro_rules! proto_msg_match {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   220
    ($var: expr, def = $default: expr, $($num: expr => $constr: ident $res: tt),*) => (
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   221
        match $var {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   222
            $($num => (proto_msg_case!($constr $res)).boxed()),*,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   223
            _ => Just($default).boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   224
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   225
    )
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   226
}
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   227
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   228
    /// Wrapper type for generating non-empty strings
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   229
    #[derive(Debug)]
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   230
    pub struct Ascii(String);
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   231
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   232
    impl Arbitrary for Ascii {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   233
        type Parameters = <String as Arbitrary>::Parameters;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   234
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   235
        fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   236
            "[a-zA-Z0-9]+".prop_map(Ascii).boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   237
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   238
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   239
        type Strategy = BoxedStrategy<Ascii>;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   240
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   241
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   242
    impl Arbitrary for GameCfg {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   243
        type Parameters = ();
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   244
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   245
        fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   246
            use crate::types::GameCfg::*;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   247
            (0..10)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   248
                .no_shrink()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   249
                .prop_flat_map(|i| {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   250
                    proto_msg_match!(i, def = FeatureSize(0),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   251
            0 => FeatureSize(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   252
            1 => MapType(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   253
            2 => MapGenerator(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   254
            3 => MazeSize(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   255
            4 => Seed(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   256
            5 => Template(u32),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   257
            6 => Ammo(Ascii, Option<Ascii>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   258
            7 => Scheme(Ascii, Vec<Ascii>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   259
            8 => Script(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   260
            9 => Theme(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   261
            10 => DrawnMap(Ascii))
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   262
                })
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   263
                .boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   264
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   265
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   266
        type Strategy = BoxedStrategy<GameCfg>;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   267
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   268
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   269
    impl Arbitrary for TeamInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   270
        type Parameters = ();
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   271
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   272
        fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   273
            (
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   274
                "[a-z]+",
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   275
                0u8..127u8,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   276
                "[a-z]+",
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   277
                "[a-z]+",
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   278
                "[a-z]+",
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   279
                "[a-z]+",
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   280
                0u8..127u8,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   281
            )
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   282
                .prop_map(|(name, color, grave, fort, voice_pack, flag, difficulty)| {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   283
                    fn hog(n: u8) -> HedgehogInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   284
                        HedgehogInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   285
                            name: format!("hog{}", n),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   286
                            hat: format!("hat{}", n),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   287
                        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   288
                    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   289
                    let hedgehogs = [
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   290
                        hog(1),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   291
                        hog(2),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   292
                        hog(3),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   293
                        hog(4),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   294
                        hog(5),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   295
                        hog(6),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   296
                        hog(7),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   297
                        hog(8),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   298
                    ];
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   299
                    TeamInfo {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   300
                        owner: String::new(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   301
                        name,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   302
                        color,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   303
                        grave,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   304
                        fort,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   305
                        voice_pack,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   306
                        flag,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   307
                        difficulty,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   308
                        hedgehogs,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   309
                        hedgehogs_number: 0,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   310
                    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   311
                })
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   312
                .boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   313
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   314
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   315
        type Strategy = BoxedStrategy<TeamInfo>;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   316
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   317
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   318
    impl Arbitrary for ServerVar {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   319
        type Parameters = ();
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   320
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   321
        fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   322
            (0..=2)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   323
                .no_shrink()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   324
                .prop_flat_map(|i| {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   325
                    proto_msg_match!(i, def = ServerVar::LatestProto(0),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   326
                        0 => MOTDNew(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   327
                        1 => MOTDOld(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   328
                        2 => LatestProto(u16)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   329
                    )
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   330
                })
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   331
                .boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   332
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   333
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   334
        type Strategy = BoxedStrategy<ServerVar>;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   335
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   336
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   337
    impl Arbitrary for VoteType {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   338
        type Parameters = ();
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   339
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   340
        fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   341
            use VoteType::*;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   342
            (0..=4)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   343
                .no_shrink()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   344
                .prop_flat_map(|i| {
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   345
                    proto_msg_match!(i, def = VoteType::Pause,
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   346
                        0 => Kick(Ascii),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   347
                        1 => Map(Option<Ascii>),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   348
                        2 => Pause(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   349
                        3 => NewSeed(),
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   350
                        4 => HedgehogsPerTeam(u8)
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   351
                    )
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   352
                })
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   353
                .boxed()
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   354
        }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   355
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   356
        type Strategy = BoxedStrategy<VoteType>;
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   357
    }
747278149393 Extract network protocol into a separate crate
unc0rr
parents:
diff changeset
   358
}