avocado_schema/core/constraint/array/
unique.rs

1use crate::core::constraint::Constraint;
2use crate::core::value::FieldValue;
3use anyhow::anyhow;
4
5#[derive(Debug)]
6pub struct Unique {
7    pub unique: bool,
8}
9
10impl Constraint for Unique {
11    fn validate(&self, val: &FieldValue) -> anyhow::Result<()> {
12        match val {
13            FieldValue::Array(v) if self.unique => {
14                let mut values: Vec<FieldValue> = vec![];
15                for value in v {
16                    if !values.contains(value) {
17                        values.push(value.clone())
18                    } else {
19                        return Err(anyhow!(format!(
20                            "array contains duplicated item(s) ({})",
21                            "Unique"
22                        )));
23                    }
24                }
25                Ok(())
26            }
27            _ => Ok(()),
28        }
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use crate::core::constraint::array::unique::Unique;
35    use crate::core::constraint::Constraint;
36    use crate::core::value::FieldValue;
37
38    #[test]
39    fn test_unique() {
40        let constraint = Unique { unique: true };
41
42        let value = FieldValue::Array(vec![
43            FieldValue::Integer(1),
44            FieldValue::Integer(2),
45            FieldValue::Integer(3),
46        ]);
47        assert!(constraint.validate(&value).is_ok());
48
49        let value = FieldValue::Array(vec![
50            FieldValue::Integer(1),
51            FieldValue::Integer(2),
52            FieldValue::Integer(2),
53        ]);
54        assert!(constraint.validate(&value).is_err());
55    }
56}