1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::{collections::HashSet, hash::Hash, ops::Deref};
use derive_more::Display;
use crate::{
registry::MetaSchema,
types::Type,
validation::{Validator, ValidatorMeta},
};
#[derive(Display, Default)]
#[display(fmt = "uniqueItems()")]
pub struct UniqueItems;
impl UniqueItems {
#[inline]
pub fn new() -> Self {
Self
}
}
impl<T: Deref<Target = [E]>, E: Type + Eq + Hash> Validator<T> for UniqueItems {
#[inline]
fn check(&self, value: &T) -> bool {
let mut set = HashSet::new();
for item in value.deref() {
if !set.insert(item) {
return false;
}
}
true
}
}
impl ValidatorMeta for UniqueItems {
fn update_meta(&self, meta: &mut MetaSchema) {
meta.unique_items = Some(true);
}
}