tbp/
randomizer.rs

1use derive_more::From;
2use serde::{Deserialize, Serialize};
3
4use crate::data::Piece;
5
6#[derive(Serialize, Deserialize, Clone, Debug, From)]
7#[serde(rename_all = "snake_case")]
8#[non_exhaustive]
9pub enum RandomizerRule {
10    Uniform,
11    SevenBag,
12    GeneralBag,
13    Unknown,
14}
15
16#[derive(Serialize, Deserialize, Clone, Debug, From)]
17#[serde(tag = "type")]
18#[serde(rename_all = "snake_case")]
19#[non_exhaustive]
20pub enum RandomizerState {
21    Uniform,
22    SevenBag(SevenBag),
23    GeneralBag(GeneralBag),
24    Unknown,
25}
26
27gen_type! {
28    pub struct SevenBag {
29        required bag_state: Vec<Piece>,
30    }
31
32    pub struct GeneralBag {
33        required current_bag: Bag,
34        required filled_bag: Bag,
35    }
36
37    pub struct Bag {
38        #[serde(rename = "I")] i: u32,
39        #[serde(rename = "O")] o: u32,
40        #[serde(rename = "T")] t: u32,
41        #[serde(rename = "L")] l: u32,
42        #[serde(rename = "J")] j: u32,
43        #[serde(rename = "S")] s: u32,
44        #[serde(rename = "Z")] z: u32,
45    }
46}
47
48impl Default for RandomizerRule {
49    fn default() -> Self {
50        RandomizerRule::Unknown
51    }
52}
53
54impl Default for RandomizerState {
55    fn default() -> Self {
56        RandomizerState::Unknown
57    }
58}
59
60impl std::ops::Index<Piece> for Bag {
61    type Output = u32;
62    fn index(&self, piece: Piece) -> &u32 {
63        match piece {
64            Piece::I => &self.i,
65            Piece::O => &self.o,
66            Piece::T => &self.t,
67            Piece::L => &self.l,
68            Piece::J => &self.j,
69            Piece::S => &self.s,
70            Piece::Z => &self.z,
71        }
72    }
73}
74
75impl std::ops::IndexMut<Piece> for Bag {
76    fn index_mut(&mut self, piece: Piece) -> &mut u32 {
77        match piece {
78            Piece::I => &mut self.i,
79            Piece::O => &mut self.o,
80            Piece::T => &mut self.t,
81            Piece::L => &mut self.l,
82            Piece::J => &mut self.j,
83            Piece::S => &mut self.s,
84            Piece::Z => &mut self.z,
85        }
86    }
87}