stepflow_data/value/
valid_value.rs

1use super::InvalidValue;
2use super::Value;
3use crate::var::{Var, VarId};
4
5#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde-support", derive(serde::Serialize))]
7pub struct ValidVal {
8  val: Box<dyn Value>,
9  validated_by: VarId,
10}
11
12impl ValidVal {
13  pub fn try_new(val: Box<dyn Value>, validate_with: &Box<dyn Var + Send + Sync>) -> Result<Self, InvalidValue> {
14    match validate_with.validate_val_type(&val) {
15      Ok(_) => Ok(Self { 
16        val: val, 
17        validated_by: validate_with.id().clone() 
18      }),
19      Err(e) => Err(e),
20    }
21  }
22
23  pub fn get_val(&self) -> &Box<dyn Value> {
24    &self.val
25  }
26}
27
28impl PartialEq for ValidVal {
29    fn eq(&self, other: &Self) -> bool {
30        self.val.eq_box(&other.val) && self.validated_by == other.validated_by
31    }
32}
33
34#[cfg(test)]
35mod tests {
36  use stepflow_test_util::test_id;
37  use crate::{var::{Var, VarId, EmailVar, StringVar}, value::{EmailValue, StringValue}};
38  use super::ValidVal;
39
40  #[test]
41  fn partial_eq() {
42    const EMAIL1: &str = "a@b.com";
43    const EMAIL2: &str = "ab@bc.com";
44
45    // same var, same base value
46    let email_var: Box<dyn Var + Send + Sync + 'static> = Box::new(EmailVar::new(test_id!(VarId)));
47    let email_val1 = EmailValue::try_new(EMAIL1).unwrap();
48    let valid_email = ValidVal::try_new(Box::new(email_val1.clone()), &email_var).unwrap();
49    let valid_email_same = ValidVal::try_new(Box::new(email_val1), &email_var).unwrap();
50
51    // same var, different base value
52    let email_val2 = EmailValue::try_new(EMAIL2).unwrap();
53    let valid_email_different = ValidVal::try_new(Box::new(email_val2), &email_var).unwrap();
54
55    // different var, same base value
56    let string_var: Box<dyn Var + Send + Sync + 'static> = Box::new(StringVar::new(test_id!(VarId)));
57    let string_val = StringValue::try_new(EMAIL1).unwrap();
58    let valid_string = ValidVal::try_new(Box::new(string_val), &string_var).unwrap();
59
60    assert_eq!(valid_email, valid_email_same);
61    assert_ne!(valid_email, valid_email_different);
62    assert_ne!(valid_email, valid_string);
63  }
64}