Skip to main content

graphql_query/validate/rules/
mod.rs

1use crate::visit::ComposedVisitor;
2
3// Missing schemaless rules
4// https://github.com/graphql/graphql-js/blob/main/src/validation/rules/DeferStreamDirectiveLabelRule.ts
5// https://github.com/graphql/graphql-js/blob/main/src/validation/rules/DeferStreamDirectiveOnValidOperationsRule.ts
6mod known_fragment_names;
7mod lone_anonymous_operation;
8mod no_fragment_cycles;
9mod no_undefined_variables;
10mod no_unused_fragments;
11mod no_unused_variables;
12mod unique_argument_names;
13mod unique_fragment_names;
14mod unique_operation_names;
15mod unique_variable_names;
16
17pub use super::context::ValidationContext;
18pub use known_fragment_names::*;
19pub use lone_anonymous_operation::*;
20pub use no_fragment_cycles::*;
21pub use no_undefined_variables::*;
22pub use no_unused_fragments::*;
23pub use no_unused_variables::*;
24pub use unique_argument_names::*;
25pub use unique_fragment_names::*;
26pub use unique_operation_names::*;
27pub use unique_variable_names::*;
28
29/// All of GraphQL's validation rules which don't require a schema to be run combined into one
30/// `ValidationRule`.
31///
32/// See: [`ComposedVisitor`]
33pub type DefaultRules<'a> = ComposedVisitor<
34    'a,
35    ValidationContext<'a>,
36    ComposedVisitor<
37        'a,
38        ValidationContext<'a>,
39        ComposedVisitor<'a, ValidationContext<'a>, LoneAnonymousOperation, UniqueVariableNames<'a>>,
40        ComposedVisitor<
41            'a,
42            ValidationContext<'a>,
43            UniqueFragmentNames<'a>,
44            UniqueOperationNames<'a>,
45        >,
46    >,
47    ComposedVisitor<
48        'a,
49        ValidationContext<'a>,
50        ComposedVisitor<'a, ValidationContext<'a>, NoUnusedFragments<'a>, UniqueArgumentNames<'a>>,
51        ComposedVisitor<
52            'a,
53            ValidationContext<'a>,
54            KnownFragmentNames<'a>,
55            ComposedVisitor<
56                'a,
57                ValidationContext<'a>,
58                NoFragmentCycles<'a>,
59                ComposedVisitor<
60                    'a,
61                    ValidationContext<'a>,
62                    NoUndefinedVariables<'a>,
63                    NoUnusedVariables<'a>,
64                >,
65            >,
66        >,
67    >,
68>;
69
70#[cfg(test)]
71mod tests {
72    use super::super::*;
73    use super::*;
74    use crate::ast::*;
75
76    #[test]
77    fn passes() {
78        let ctx = ASTContext::new();
79        let document = Document::parse(
80            &ctx,
81            "query A { __typename } query B { ...Test } fragment Test on Query { __typename }",
82        )
83        .unwrap();
84        DefaultRules::validate(&ctx, document).unwrap();
85    }
86
87    #[test]
88    fn fails() {
89        let ctx = ASTContext::new();
90
91        let document = Document::parse(
92            &ctx,
93            "query A { __typename } query B { __typename } fragment Test on Query { __typename }",
94        )
95        .unwrap();
96        DefaultRules::validate(&ctx, document).unwrap_err();
97
98        let document = Document::parse(
99            &ctx,
100            "query { __typename } query { ...Test } fragment Test on Query { __typename }",
101        )
102        .unwrap();
103        DefaultRules::validate(&ctx, document).unwrap_err();
104    }
105}