contained_core/states/
state.rs

1/*
2    Appellation: state <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4    Description: ... summary ...
5*/
6use decanter::prelude::Hashable;
7use serde::{Deserialize, Serialize};
8use strum::{Display, EnumString, EnumVariantNames};
9
10#[derive(
11    Clone,
12    Copy,
13    Debug,
14    Default,
15    Deserialize,
16    Display,
17    EnumString,
18    EnumVariantNames,
19    Eq,
20    Hash,
21    Hashable,
22    Ord,
23    PartialEq,
24    PartialOrd,
25    Serialize,
26)]
27#[repr(i64)]
28#[strum(serialize_all = "snake_case")]
29pub enum State {
30    #[default]
31    Valid = 0,
32    Invalid = 1,
33}
34
35impl State {
36    pub fn invalid() -> Self {
37        Self::Invalid
38    }
39    pub fn valid() -> Self {
40        Self::Valid
41    }
42    pub fn invalidate(&mut self) {
43        *self = Self::Invalid;
44    }
45    pub fn validate(&mut self) {
46        *self = Self::Valid;
47    }
48    pub fn is_valid(&self) -> bool {
49        *self == Self::Valid
50    }
51}
52
53impl AsRef<[u8]> for State {
54    fn as_ref(&self) -> &[u8] {
55        match self {
56            Self::Invalid => b"invalid",
57            Self::Valid => b"valid",
58        }
59    }
60}
61
62impl Unpin for State {}
63
64impl std::ops::Mul for State {
65    type Output = Self;
66
67    fn mul(self, rhs: Self) -> Self::Output {
68        match self {
69            Self::Invalid => match rhs {
70                Self::Invalid => Self::Invalid,
71                Self::Valid => Self::Valid,
72            },
73            Self::Valid => match rhs {
74                Self::Invalid => Self::Invalid,
75                Self::Valid => Self::Valid,
76            },
77        }
78    }
79}
80
81impl std::ops::MulAssign for State {
82    fn mul_assign(&mut self, rhs: Self) {
83        *self = *self * rhs;
84    }
85}
86
87impl From<usize> for State {
88    fn from(d: usize) -> Self {
89        Self::from(d as i64)
90    }
91}
92
93impl From<i64> for State {
94    fn from(d: i64) -> Self {
95        match d.abs() % 2 {
96            0 => State::valid(),
97            _ => State::invalid(),
98        }
99    }
100}
101
102impl From<State> for i64 {
103    fn from(d: State) -> i64 {
104        d as i64
105    }
106}