contained_core/states/
state.rs1use 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}