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 crate::validation::context::ValidatorContext; use crate::validation::visitor::Visitor; use graphql_parser::query::{Mutation, OperationDefinition, Query, Subscription}; use std::collections::HashSet; #[derive(Default)] pub struct UniqueOperationNames<'a> { names: HashSet<&'a str>, } impl<'a> Visitor<'a> for UniqueOperationNames<'a> { fn enter_operation_definition( &mut self, ctx: &mut ValidatorContext<'a>, operation_definition: &'a OperationDefinition, ) { let name = match operation_definition { OperationDefinition::Query(Query { name, position, .. }) => { name.as_ref().map(|name| (name, position)) } OperationDefinition::Mutation(Mutation { name, position, .. }) => { name.as_ref().map(|name| (name, position)) } OperationDefinition::Subscription(Subscription { name, position, .. }) => { name.as_ref().map(|name| (name, position)) } OperationDefinition::SelectionSet(_) => None, }; if let Some((name, pos)) = name { if !self.names.insert(name.as_str()) { ctx.report_error( vec![*pos], format!("There can only be one operation named \"{}\"", name), ) } } } }