tbp 3.0.0

Tetris Bot Protocol types crate
Documentation
use derive_more::From;
use serde::{Deserialize, Serialize};

use crate::data::Piece;

#[derive(Serialize, Deserialize, Clone, Debug, From)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RandomizerRule {
    Uniform,
    SevenBag,
    GeneralBag,
    Unknown,
}

#[derive(Serialize, Deserialize, Clone, Debug, From)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RandomizerState {
    Uniform,
    SevenBag(SevenBag),
    GeneralBag(GeneralBag),
    Unknown,
}

gen_type! {
    pub struct SevenBag {
        required bag_state: Vec<Piece>,
    }

    pub struct GeneralBag {
        required current_bag: Bag,
        required filled_bag: Bag,
    }

    pub struct Bag {
        #[serde(rename = "I")] i: u32,
        #[serde(rename = "O")] o: u32,
        #[serde(rename = "T")] t: u32,
        #[serde(rename = "L")] l: u32,
        #[serde(rename = "J")] j: u32,
        #[serde(rename = "S")] s: u32,
        #[serde(rename = "Z")] z: u32,
    }
}

impl Default for RandomizerRule {
    fn default() -> Self {
        RandomizerRule::Unknown
    }
}

impl Default for RandomizerState {
    fn default() -> Self {
        RandomizerState::Unknown
    }
}

impl std::ops::Index<Piece> for Bag {
    type Output = u32;
    fn index(&self, piece: Piece) -> &u32 {
        match piece {
            Piece::I => &self.i,
            Piece::O => &self.o,
            Piece::T => &self.t,
            Piece::L => &self.l,
            Piece::J => &self.j,
            Piece::S => &self.s,
            Piece::Z => &self.z,
        }
    }
}

impl std::ops::IndexMut<Piece> for Bag {
    fn index_mut(&mut self, piece: Piece) -> &mut u32 {
        match piece {
            Piece::I => &mut self.i,
            Piece::O => &mut self.o,
            Piece::T => &mut self.t,
            Piece::L => &mut self.l,
            Piece::J => &mut self.j,
            Piece::S => &mut self.s,
            Piece::Z => &mut self.z,
        }
    }
}