Skip to content

Commit 3b6ecf7

Browse files
authored
feat: KnownDirectives rule (#28)
1 parent 7c9ba34 commit 3b6ecf7

File tree

7 files changed

+355
-11
lines changed

7 files changed

+355
-11
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ cargo add graphql-tools
5959
- [x] UniqueVariableNames
6060
- [x] NoUndefinedVariables
6161
- [x] NoUnusedVariables
62-
- [ ] KnownDirectives
62+
- [x] KnownDirectives
6363
- [ ] UniqueDirectivesPerLocation
6464
- [x] KnownArgumentNames
6565
- [x] UniqueArgumentNames

src/ast/ext.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::collections::HashMap;
22

33
use crate::static_graphql::query::{
4-
self, FragmentSpread, OperationDefinition, SelectionSet, Type, Value, VariableDefinition,
4+
self, Directive, FragmentSpread, OperationDefinition, SelectionSet, Type, Value,
5+
VariableDefinition,
56
};
67
use crate::static_graphql::schema::{
78
self, DirectiveDefinition, InputValue, InterfaceType, ObjectType, TypeDefinition, UnionType,
@@ -43,6 +44,7 @@ impl FieldByNameExtension for TypeDefinition {
4344

4445
pub trait OperationDefinitionExtension {
4546
fn variable_definitions(&self) -> &[VariableDefinition];
47+
fn directives(&self) -> &[Directive];
4648
fn selection_set(&self) -> &SelectionSet;
4749
}
4850

@@ -64,6 +66,15 @@ impl OperationDefinitionExtension for OperationDefinition {
6466
OperationDefinition::Subscription(subscription) => &subscription.selection_set,
6567
}
6668
}
69+
70+
fn directives(&self) -> &[Directive] {
71+
match self {
72+
OperationDefinition::Query(query) => &query.directives,
73+
OperationDefinition::SelectionSet(_) => &[],
74+
OperationDefinition::Mutation(mutation) => &mutation.directives,
75+
OperationDefinition::Subscription(subscription) => &subscription.directives,
76+
}
77+
}
6778
}
6879

6980
pub trait SchemaDocumentExtension {

src/ast/operation_visitor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ fn visit_definitions<'a, Visitor, UserContext>(
172172

173173
fn visit_directives<'a, Visitor, UserContext>(
174174
visitor: &mut Visitor,
175-
directives: &Vec<Directive>,
175+
directives: &[Directive],
176176
context: &mut OperationVisitorContext<'a>,
177177
user_context: &mut UserContext,
178178
) where
@@ -431,7 +431,7 @@ fn visit_operation_definition<'a, Visitor, UserContext>(
431431
Visitor: OperationVisitor<'a, UserContext>,
432432
{
433433
visitor.enter_operation_definition(context, user_context, operation);
434-
// DOTAN: Maybe we need to iterate directives as well? but i think graphql_parser does not have it at the moment?
434+
visit_directives(visitor, operation.directives(), context, user_context);
435435
visit_variable_definitions(
436436
visitor,
437437
operation.variable_definitions(),

src/validation/rules/defaults.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use crate::validation::validate::ValidationPlan;
22

33
use super::{
4-
FieldsOnCorrectType, FragmentsOnCompositeTypes, KnownArgumentNames, KnownFragmentNames,
5-
KnownTypeNames, LeafFieldSelections, LoneAnonymousOperation, NoFragmentsCycle,
6-
NoUndefinedVariables, NoUnusedFragments, NoUnusedVariables, OverlappingFieldsCanBeMerged,
7-
PossibleFragmentSpreads, ProvidedRequiredArguments, SingleFieldSubscriptions,
8-
UniqueArgumentNames, UniqueFragmentNames, UniqueOperationNames, UniqueVariableNames,
9-
VariablesAreInputTypes,
4+
FieldsOnCorrectType, FragmentsOnCompositeTypes, KnownArgumentNames, KnownDirectives,
5+
KnownFragmentNames, KnownTypeNames, LeafFieldSelections, LoneAnonymousOperation,
6+
NoFragmentsCycle, NoUndefinedVariables, NoUnusedFragments, NoUnusedVariables,
7+
OverlappingFieldsCanBeMerged, PossibleFragmentSpreads, ProvidedRequiredArguments,
8+
SingleFieldSubscriptions, UniqueArgumentNames, UniqueFragmentNames, UniqueOperationNames,
9+
UniqueVariableNames, VariablesAreInputTypes,
1010
};
1111

1212
pub fn default_rules_validation_plan() -> ValidationPlan {
@@ -32,6 +32,7 @@ pub fn default_rules_validation_plan() -> ValidationPlan {
3232
plan.add_rule(Box::new(UniqueArgumentNames::new()));
3333
plan.add_rule(Box::new(UniqueVariableNames::new()));
3434
plan.add_rule(Box::new(ProvidedRequiredArguments::new()));
35+
plan.add_rule(Box::new(KnownDirectives::new()));
3536

3637
plan
3738
}

0 commit comments

Comments
 (0)