avocado_schema/core/constraint/array/
unique.rs1use 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}