bluejay_validator/executable/document/rules/
variable_uniqueness.rs1use crate::executable::{
2 document::{Error, Rule, Visitor},
3 Cache,
4};
5use crate::utils::duplicates;
6use bluejay_core::definition::SchemaDefinition;
7use bluejay_core::executable::{ExecutableDocument, VariableDefinition};
8use bluejay_core::AsIter;
9
10pub struct VariableUniqueness<'a, E: ExecutableDocument, S: SchemaDefinition> {
11 errors: Vec<Error<'a, E, S>>,
12}
13
14impl<'a, E: ExecutableDocument + 'a, S: SchemaDefinition + 'a> Visitor<'a, E, S>
15 for VariableUniqueness<'a, E, S>
16{
17 fn new(_: &'a E, _: &'a S, _: &'a Cache<'a, E, S>) -> Self {
18 Self { errors: Vec::new() }
19 }
20
21 fn visit_variable_definitions(
22 &mut self,
23 variable_definitions: &'a <E as ExecutableDocument>::VariableDefinitions,
24 ) {
25 self.errors.extend(
26 duplicates(variable_definitions.iter(), VariableDefinition::variable).map(
27 |(name, variable_definitions)| Error::NonUniqueVariableDefinitionNames {
28 name,
29 variable_definitions,
30 },
31 ),
32 );
33 }
34}
35
36impl<'a, E: ExecutableDocument + 'a, S: SchemaDefinition + 'a> Rule<'a, E, S>
37 for VariableUniqueness<'a, E, S>
38{
39 type Error = Error<'a, E, S>;
40 type Errors = std::vec::IntoIter<Error<'a, E, S>>;
41
42 fn into_errors(self) -> Self::Errors {
43 self.errors.into_iter()
44 }
45}