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

35 lines
975 B
Rust
Raw Normal View History

2020-03-19 09:20:12 +00:00
use crate::registry;
2020-03-24 10:54:22 +00:00
use crate::validation::visitor::{Visitor, VisitorContext};
2020-03-09 04:08:50 +00:00
use graphql_parser::query::Field;
#[derive(Default)]
pub struct FieldsOnCorrectType;
impl<'a> Visitor<'a> for FieldsOnCorrectType {
2020-03-22 08:45:59 +00:00
fn enter_field(&mut self, ctx: &mut VisitorContext<'a>, field: &'a Field) {
2020-03-09 04:08:50 +00:00
if ctx
.parent_type()
.unwrap()
.field_by_name(&field.name)
.is_none()
{
if let Some(registry::Type::Union { .. }) | Some(registry::Type::Interface { .. }) =
ctx.parent_type()
{
2020-03-09 04:08:50 +00:00
if field.name == "__typename" {
return;
}
}
ctx.report_error(
vec![field.position],
format!(
"Unknown field \"{}\" on type \"{}\"",
field.name,
ctx.parent_type().unwrap().name()
),
);
}
}
}