graphgate_validation/
lib.rs

1#![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}