stepflow_data/value/
valid_value.rs1use 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 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 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 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}