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::{OperationDefinition, VariableDefinition};
|
|
|
|
use graphql_parser::schema::Value;
|
2020-03-09 10:05:52 +00:00
|
|
|
use graphql_parser::Pos;
|
|
|
|
use std::collections::HashSet;
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
pub struct NoUndefinedVariables<'a> {
|
|
|
|
vars: HashSet<&'a str>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Visitor<'a> for NoUndefinedVariables<'a> {
|
|
|
|
fn enter_operation_definition(
|
|
|
|
&mut self,
|
2020-03-22 08:45:59 +00:00
|
|
|
_ctx: &mut VisitorContext<'a>,
|
2020-03-09 10:05:52 +00:00
|
|
|
_operation_definition: &'a OperationDefinition,
|
|
|
|
) {
|
|
|
|
self.vars.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn enter_variable_definition(
|
|
|
|
&mut self,
|
2020-03-22 08:45:59 +00:00
|
|
|
_ctx: &mut VisitorContext<'a>,
|
2020-03-09 10:05:52 +00:00
|
|
|
variable_definition: &'a VariableDefinition,
|
|
|
|
) {
|
|
|
|
self.vars.insert(&variable_definition.name);
|
|
|
|
}
|
|
|
|
|
2020-03-09 12:39:46 +00:00
|
|
|
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: &str,
|
|
|
|
value: &'a Value,
|
|
|
|
) {
|
2020-03-09 10:05:52 +00:00
|
|
|
if let Value::Variable(var_name) = value {
|
|
|
|
if !self.vars.contains(var_name.as_str()) {
|
|
|
|
ctx.report_error(
|
2020-03-09 12:39:46 +00:00
|
|
|
vec![pos],
|
2020-03-09 10:05:52 +00:00
|
|
|
format!("Variable \"${}\" is not defined", var_name),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|