stepflow_data/value/
true_value.rs1use crate::InvalidValue;
2
3use super::{Value, BaseValue};
4
5#[derive(Debug, PartialEq, Clone)]
6#[cfg_attr(feature = "serde-support", derive(serde::Serialize))]
7pub struct TrueValue;
8
9impl TrueValue {
10 pub fn new() -> Self { Self {} }
11 pub fn val(&self) -> bool { true }
12 pub fn boxed(self) -> Box<dyn Value> { Box::new(self) }
13}
14
15impl Value for TrueValue {
16 fn get_baseval(&self) -> BaseValue {
17 BaseValue::Boolean(true)
18 }
19
20 fn clone_box(&self) -> Box<dyn Value> {
21 Box::new(self.clone())
22 }
23
24 fn eq_box(&self, other: &Box<dyn Value>) -> bool {
25 other.is::<Self>()
27 }
28}
29
30impl std::str::FromStr for TrueValue {
31 type Err = InvalidValue;
32
33 fn from_str(s: &str) -> Result<Self, Self::Err> {
34 if s.to_lowercase() == "true" {
35 Ok(TrueValue::new())
36 } else {
37 Err(InvalidValue::WrongValue)
38 }
39 }
40}
41
42
43#[cfg(test)]
44mod tests {
45 use crate::{BaseValue, InvalidValue, value::StringValue};
46 use super::{TrueValue, Value};
47
48 #[test]
49 fn is_true() {
50 let true_val = TrueValue::new();
51 assert_eq!(true_val.val(), true);
52 assert!(matches!(true_val.get_baseval(), BaseValue::Boolean(f) if f == true));
53 }
54
55 #[test]
56 fn partial_eq() {
57 let true_val1 = TrueValue::new();
58 let true_val2 = TrueValue::new();
59 assert_eq!(true_val1, true_val2);
60
61 let b1: Box<dyn Value> = Box::new(true_val1);
62 let b2: Box<dyn Value> = Box::new(true_val2);
63 assert!(b1 == b2);
64
65 let string_val = StringValue::try_new("true").unwrap();
66 let s: Box<dyn Value> = Box::new(string_val);
67 assert!(b1 != s);
68 }
69
70 #[test]
71 fn from_str() {
72 assert_eq!("true".parse::<TrueValue>(), Ok(TrueValue::new()));
73 assert_eq!("tRuE".parse::<TrueValue>(), Ok(TrueValue::new()));
74 assert_eq!("tRuEe".parse::<TrueValue>(), Err(InvalidValue::WrongValue));
75 }
76}