graphgate_validation/
lib.rs1#![forbid(unsafe_code)]
2
3#[cfg(test)]
4#[macro_use]
5mod test_harness;
6
7mod error;
8mod rules;
9mod suggestion;
10mod utils;
11mod visitor;
12
13use graphgate_schema::ComposedSchema;
14use parser::types::ExecutableDocument;
15use value::Variables;
16
17use visitor::{visit, Visitor, VisitorContext, VisitorNil};
18
19pub use error::RuleError;
20
21macro_rules! rules {
22 ($($rule:ident),*) => {
23 VisitorNil$(.with(rules::$rule::default()))*
24 };
25}
26
27pub fn check_rules(
28 composed_schema: &ComposedSchema,
29 document: &ExecutableDocument,
30 variables: &Variables,
31) -> Vec<RuleError> {
32 let mut ctx = VisitorContext::new(composed_schema, document, variables);
33 let mut visitor = rules!(
34 ArgumentsOfCorrectType,
35 DefaultValuesOfCorrectType,
36 FieldsOnCorrectType,
37 FragmentsOnCompositeTypes,
38 KnownArgumentNames,
39 KnownDirectives,
40 KnownFragmentNames,
41 KnownTypeNames,
42 NoFragmentCycles,
43 NoUndefinedVariables,
44 NoUnusedVariables,
45 NoUnusedFragments,
46 OverlappingFieldsCanBeMerged,
47 PossibleFragmentSpreads,
48 ProvidedNonNullArguments,
49 ScalarLeafs,
50 UniqueArgumentNames,
51 UniqueVariableNames,
52 VariablesAreInputTypes,
53 VariableInAllowedPosition
54 );
55 visit(&mut visitor, &mut ctx, &document);
56 ctx.errors
57}