2020-03-09 10:05:52 +00:00
|
|
|
use crate::registry::TypeName;
|
2020-03-22 08:45:59 +00:00
|
|
|
use crate::visitor::{Visitor, VisitorContext};
|
2020-03-09 10:05:52 +00:00
|
|
|
use graphql_parser::query::{
|
|
|
|
FragmentDefinition, InlineFragment, TypeCondition, VariableDefinition,
|
|
|
|
};
|
|
|
|
use graphql_parser::Pos;
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
pub struct KnownTypeNames;
|
|
|
|
|
|
|
|
impl<'a> Visitor<'a> for KnownTypeNames {
|
|
|
|
fn enter_fragment_definition(
|
|
|
|
&mut self,
|
2020-03-22 08:45:59 +00:00
|
|
|
ctx: &mut VisitorContext<'a>,
|
2020-03-09 10:05:52 +00:00
|
|
|
fragment_definition: &'a FragmentDefinition,
|
|
|
|
) {
|
|
|
|
let TypeCondition::On(name) = &fragment_definition.type_condition;
|
|
|
|
validate_type(ctx, &name, fragment_definition.position);
|
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
) {
|
|
|
|
validate_type(
|
|
|
|
ctx,
|
2020-03-09 12:39:46 +00:00
|
|
|
TypeName::get_basic_typename(&variable_definition.var_type.to_string()),
|
2020-03-09 10:05:52 +00:00
|
|
|
variable_definition.position,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn enter_inline_fragment(
|
|
|
|
&mut self,
|
2020-03-22 08:45:59 +00:00
|
|
|
ctx: &mut VisitorContext<'a>,
|
2020-03-09 10:05:52 +00:00
|
|
|
inline_fragment: &'a InlineFragment,
|
|
|
|
) {
|
|
|
|
if let Some(TypeCondition::On(name)) = &inline_fragment.type_condition {
|
|
|
|
validate_type(ctx, &name, inline_fragment.position);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 08:45:59 +00:00
|
|
|
fn validate_type(ctx: &mut VisitorContext<'_>, type_name: &str, pos: Pos) {
|
2020-03-09 10:05:52 +00:00
|
|
|
if ctx.registry.types.get(type_name).is_none() {
|
|
|
|
ctx.report_error(vec![pos], format!(r#"Unknown type "{}""#, type_name));
|
|
|
|
}
|
|
|
|
}
|