datex_core/values/core_values/
boolean.rs1use 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}
61impl<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}