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

36 lines
944 B
Rust
Raw Normal View History

2020-03-24 10:54:22 +00:00
use crate::validation::visitor::{Visitor, VisitorContext};
2020-03-09 12:39:46 +00:00
use graphql_parser::query::Field;
use graphql_parser::schema::{Directive, Value};
use graphql_parser::Pos;
use std::collections::HashSet;
#[derive(Default)]
pub struct UniqueArgumentNames<'a> {
names: HashSet<&'a str>,
}
impl<'a> Visitor<'a> for UniqueArgumentNames<'a> {
2020-03-22 08:45:59 +00:00
fn enter_directive(&mut self, _ctx: &mut VisitorContext<'a>, _directive: &'a Directive) {
2020-03-09 12:39:46 +00:00
self.names.clear();
}
fn enter_argument(
&mut self,
2020-03-22 08:45:59 +00:00
ctx: &mut VisitorContext<'a>,
2020-03-09 12:39:46 +00:00
pos: Pos,
name: &'a str,
_value: &'a Value,
) {
if !self.names.insert(name) {
ctx.report_error(
vec![pos],
format!("There can only be one argument named \"{}\"", name),
)
}
}
2020-03-22 08:45:59 +00:00
fn enter_field(&mut self, _ctx: &mut VisitorContext<'a>, _field: &'a Field) {
2020-03-09 12:39:46 +00:00
self.names.clear();
}
}