2020-03-08 12:35:36 +00:00
|
|
|
use crate::error::RuleErrors;
|
|
|
|
use crate::registry::Registry;
|
|
|
|
use crate::validation::context::ValidatorContext;
|
|
|
|
use crate::validation::visitor::{visit, VisitorNil};
|
|
|
|
use crate::Result;
|
|
|
|
use graphql_parser::query::Document;
|
|
|
|
|
|
|
|
mod context;
|
|
|
|
mod rules;
|
|
|
|
mod utils;
|
|
|
|
mod visitor;
|
|
|
|
|
|
|
|
pub fn check_rules(registry: &Registry, doc: &Document) -> Result<()> {
|
2020-03-09 04:08:50 +00:00
|
|
|
let mut ctx = ValidatorContext::new(registry, doc);
|
2020-03-08 12:58:22 +00:00
|
|
|
let mut visitor = VisitorNil
|
|
|
|
.with(rules::ArgumentsOfCorrectType::default())
|
2020-03-09 04:08:50 +00:00
|
|
|
.with(rules::DefaultValuesOfCorrectType)
|
|
|
|
.with(rules::FieldsOnCorrectType)
|
|
|
|
.with(rules::FragmentsOnCompositeTypes)
|
|
|
|
.with(rules::KnownArgumentNames::default())
|
|
|
|
.with(rules::NoFragmentCycles::default())
|
2020-03-09 10:05:52 +00:00
|
|
|
.with(rules::KnownFragmentNames)
|
|
|
|
.with(rules::KnownTypeNames)
|
|
|
|
.with(rules::LoneAnonymousOperation::default())
|
|
|
|
.with(rules::NoUndefinedVariables::default())
|
2020-03-09 12:39:46 +00:00
|
|
|
.with(rules::NoUnusedFragments::default())
|
|
|
|
.with(rules::NoUnusedVariables::default())
|
|
|
|
.with(rules::UniqueArgumentNames::default())
|
2020-03-10 06:14:09 +00:00
|
|
|
.with(rules::UniqueFragmentNames::default())
|
|
|
|
.with(rules::UniqueOperationNames::default())
|
|
|
|
.with(rules::UniqueVariableNames::default())
|
|
|
|
.with(rules::VariablesAreInputTypes)
|
|
|
|
.with(rules::VariableInAllowedPosition::default())
|
|
|
|
.with(rules::ScalarLeafs);
|
2020-03-08 12:35:36 +00:00
|
|
|
|
|
|
|
visit(&mut visitor, &mut ctx, doc);
|
|
|
|
if !ctx.errors.is_empty() {
|
|
|
|
Err(RuleErrors { errors: ctx.errors }.into())
|
|
|
|
} else {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|