bluejay-validator 0.3.1

A GraphQL validator
Documentation
use crate::definition::{Error, Rule, Visitor};
use crate::utils::duplicates;
use bluejay_core::definition::{InputObjectTypeDefinition, InputValueDefinition, SchemaDefinition};
use bluejay_core::AsIter;

pub struct InputFieldDefinitionUniqueness<'a, S: SchemaDefinition + 'a> {
    errors: Vec<Error<'a, S>>,
}

impl<'a, S: SchemaDefinition> Visitor<'a, S> for InputFieldDefinitionUniqueness<'a, S> {
    fn visit_input_object_type_definition(
        &mut self,
        input_object_type_definition: &'a <S as SchemaDefinition>::InputObjectTypeDefinition,
    ) {
        self.errors.extend(
            duplicates(
                input_object_type_definition
                    .input_field_definitions()
                    .iter(),
                InputValueDefinition::name,
            )
            .map(|(name, input_value_definitions)| {
                Error::NonUniqueInputValueDefinitionNames {
                    name,
                    input_value_definitions,
                }
            }),
        );
    }
}

impl<'a, S: SchemaDefinition> IntoIterator for InputFieldDefinitionUniqueness<'a, S> {
    type Item = Error<'a, S>;
    type IntoIter = std::vec::IntoIter<Error<'a, S>>;

    fn into_iter(self) -> Self::IntoIter {
        self.errors.into_iter()
    }
}

impl<'a, S: SchemaDefinition> Rule<'a, S> for InputFieldDefinitionUniqueness<'a, S> {
    type Error = Error<'a, S>;

    fn new(_: &'a S) -> Self {
        Self { errors: Vec::new() }
    }
}