datex_core/values/core_values/
boolean.rs

1use crate::values::value_container::{ValueContainer, ValueError};
2use serde::{Deserialize, Serialize};
3use std::{fmt::Display, ops::Not};
4
5use super::super::core_value_trait::CoreValueTrait;
6use crate::traits::structural_eq::StructuralEq;
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub struct Boolean(pub bool);
10
11impl Boolean {
12    pub fn as_bool(&self) -> bool {
13        self.0
14    }
15}
16impl Boolean {
17    pub fn toggle(&mut self) {
18        self.0 = !self.0;
19    }
20    pub fn is_true(&self) -> bool {
21        self.0
22    }
23    pub fn is_false(&self) -> bool {
24        !self.0
25    }
26    pub fn as_string(&self) -> String {
27        self.0.to_string()
28    }
29    pub fn as_str(&self) -> &str {
30        if self.0 { "true" } else { "false" }
31    }
32}
33
34impl Display for Boolean {
35    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
36        write!(f, "{}", self.0)
37    }
38}
39
40impl CoreValueTrait for Boolean {}
41
42impl StructuralEq for Boolean {
43    fn structural_eq(&self, other: &Self) -> bool {
44        self.0 == other.0
45    }
46}
47
48impl From<bool> for Boolean {
49    fn from(v: bool) -> Self {
50        Boolean(v)
51    }
52}
53
54impl Not for Boolean {
55    type Output = Boolean;
56
57    fn not(self) -> Self::Output {
58        Boolean(!self.0)
59    }
60}
61// new into
62impl<T: Into<ValueContainer>> TryFrom<Option<T>> for Boolean {
63    type Error = ValueError;
64    fn try_from(value: Option<T>) -> Result<Self, Self::Error> {
65        match value {
66            Some(v) => {
67                let boolean: ValueContainer = v.into();
68                boolean
69                    .to_value()
70                    .borrow()
71                    .cast_to_bool()
72                    .ok_or(ValueError::TypeConversionError)
73            }
74            None => Err(ValueError::IsVoid),
75        }
76    }
77}