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}