36 lines
1019 B
Rust
36 lines
1019 B
Rust
|
use crate::validation::context::ValidatorContext;
|
||
|
use crate::validation::visitor::Visitor;
|
||
|
use graphql_parser::query::{OperationDefinition, VariableDefinition};
|
||
|
use std::collections::HashSet;
|
||
|
|
||
|
#[derive(Default)]
|
||
|
pub struct UniqueVariableNames<'a> {
|
||
|
names: HashSet<&'a str>,
|
||
|
}
|
||
|
|
||
|
impl<'a> Visitor<'a> for UniqueVariableNames<'a> {
|
||
|
fn enter_operation_definition(
|
||
|
&mut self,
|
||
|
_ctx: &mut ValidatorContext<'a>,
|
||
|
_operation_definition: &'a OperationDefinition,
|
||
|
) {
|
||
|
self.names.clear();
|
||
|
}
|
||
|
|
||
|
fn enter_variable_definition(
|
||
|
&mut self,
|
||
|
ctx: &mut ValidatorContext<'a>,
|
||
|
variable_definition: &'a VariableDefinition,
|
||
|
) {
|
||
|
if !self.names.insert(variable_definition.name.as_str()) {
|
||
|
ctx.report_error(
|
||
|
vec![variable_definition.position],
|
||
|
format!(
|
||
|
"There can only be one variable named \"${}\"",
|
||
|
variable_definition.name
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|