async-graphql/src/validation/rules/unique_variable_names.rs

35 lines
983 B
Rust
Raw Normal View History

2020-03-24 10:54:22 +00:00
use crate::validation::visitor::{Visitor, VisitorContext};
2020-03-10 06:14:09 +00:00
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,
2020-03-22 08:45:59 +00:00
_ctx: &mut VisitorContext<'a>,
2020-03-10 06:14:09 +00:00
_operation_definition: &'a OperationDefinition,
) {
self.names.clear();
}
fn enter_variable_definition(
&mut self,
2020-03-22 08:45:59 +00:00
ctx: &mut VisitorContext<'a>,
2020-03-10 06:14:09 +00:00
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
),
);
}
}
}