bluejay_validator/executable/document/rules/
variable_uniqueness.rs

1use 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}