Skip to content

Commit 478a05c

Browse files
committed
added KnownArgumentNames
1 parent 3cb9bf4 commit 478a05c

File tree

8 files changed

+469
-28
lines changed

8 files changed

+469
-28
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ cargo add graphql-tools
6161
- [ ] NoUnusedVariables
6262
- [ ] KnownDirectives
6363
- [ ] UniqueDirectivesPerLocation
64-
- [ ] KnownArgumentNames
64+
- [x] KnownArgumentNames
6565
- [ ] UniqueArgumentNames
6666
- [ ] ValuesOfCorrectType
6767
- [ ] ProvidedRequiredArguments

src/ast/query_visitor.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::static_graphql::query::{
2-
Definition, Document, Field, FragmentDefinition, FragmentSpread, InlineFragment, Mutation,
3-
OperationDefinition, Query, Selection, SelectionSet, Subscription, Value, VariableDefinition,
2+
Definition, Directive, Document, Field, FragmentDefinition, FragmentSpread, InlineFragment,
3+
Mutation, OperationDefinition, Query, Selection, SelectionSet, Subscription, Value,
4+
VariableDefinition,
45
};
56

67
use super::DefaultVisitorContext;
@@ -109,6 +110,11 @@ pub trait QueryVisitor<T = DefaultVisitorContext> {
109110
Selection::Field(field) => {
110111
self.enter_field(field, visitor_context);
111112

113+
for directive in &field.directives {
114+
self.enter_directive(&directive, field, visitor_context);
115+
self.leave_directive(&directive, field, visitor_context);
116+
}
117+
112118
for (name, argument) in &field.arguments {
113119
self.enter_field_argument(name, argument, field, visitor_context);
114120

@@ -202,6 +208,21 @@ pub trait QueryVisitor<T = DefaultVisitorContext> {
202208
fn enter_field(&self, _node: &Field, _visitor_context: &mut T) {}
203209
fn leave_field(&self, _node: &Field, _visitor_context: &mut T) {}
204210

211+
fn enter_directive(
212+
&self,
213+
_directive: &Directive,
214+
_parent_field: &Field,
215+
_visitor_context: &mut T,
216+
) {
217+
}
218+
fn leave_directive(
219+
&self,
220+
_directive: &Directive,
221+
_parent_field: &Field,
222+
_visitor_context: &mut T,
223+
) {
224+
}
225+
205226
fn enter_field_argument(
206227
&self,
207228
_name: &String,

src/ast/type_info.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ use crate::{
55
validation::utils::find_object_type_by_name,
66
};
77

8-
use super::{find_schema_definition, CompositeType};
8+
use super::{find_schema_definition, CompositeType, TypeDefinitionExtension};
99

1010
#[derive(Debug)]
1111
pub struct TypeInfoRegistry<'a> {
1212
pub query_type: &'a schema::ObjectType,
1313
pub mutation_type: Option<&'a schema::ObjectType>,
1414
pub subscription_type: Option<&'a schema::ObjectType>,
1515
pub type_by_name: HashMap<String, &'a schema::TypeDefinition>,
16+
pub directives: HashMap<String, &'a schema::DirectiveDefinition>,
1617
}
1718

1819
impl<'a> TypeInfoRegistry<'a> {
@@ -53,26 +54,19 @@ impl<'a> TypeInfoRegistry<'a> {
5354
let type_by_name =
5455
HashMap::from_iter(schema.definitions.iter().filter_map(
5556
|definition| match definition {
56-
schema::Definition::TypeDefinition(type_definition) => match type_definition {
57-
schema::TypeDefinition::Object(object) => {
58-
Some((object.name.clone(), type_definition))
59-
}
60-
schema::TypeDefinition::Scalar(object) => {
61-
Some((object.name.clone(), type_definition))
62-
}
63-
schema::TypeDefinition::Interface(object) => {
64-
Some((object.name.clone(), type_definition))
65-
}
66-
schema::TypeDefinition::InputObject(object) => {
67-
Some((object.name.clone(), type_definition))
68-
}
69-
schema::TypeDefinition::Enum(object) => {
70-
Some((object.name.clone(), type_definition))
71-
}
72-
schema::TypeDefinition::Union(object) => {
73-
Some((object.name.clone(), type_definition))
74-
}
75-
},
57+
schema::Definition::TypeDefinition(type_definition) => {
58+
Some((type_definition.name(), type_definition))
59+
}
60+
_ => None,
61+
},
62+
));
63+
64+
let directives =
65+
HashMap::from_iter(schema.definitions.iter().filter_map(
66+
|definition| match definition {
67+
schema::Definition::DirectiveDefinition(directive_definition) => {
68+
Some((directive_definition.name.clone(), directive_definition))
69+
}
7670
_ => None,
7771
},
7872
));
@@ -82,6 +76,7 @@ impl<'a> TypeInfoRegistry<'a> {
8276
query_type,
8377
subscription_type,
8478
type_by_name,
79+
directives,
8580
};
8681
}
8782
}

src/ast/type_info_query_visitor.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
TypeInfoRegistry,
44
};
55
use crate::static_graphql::{
6-
query::{self, Field, Type, Value},
6+
query::{self, Directive, Field, Type, Value},
77
schema::{self},
88
};
99

@@ -234,6 +234,11 @@ pub trait TypeInfoQueryVisitor<T = DefaultVisitorContext> {
234234

235235
self.enter_field(field, visitor_context, type_info);
236236

237+
for directive in &field.directives {
238+
self.enter_directive(&directive, field, visitor_context, type_info);
239+
self.leave_directive(&directive, field, visitor_context, type_info);
240+
}
241+
237242
for (argument_name, argument_type) in &field.arguments {
238243
if let Some(parent_type) = type_info.get_parent_type() {
239244
if let Some(field_def) = parent_type.find_field(field.name.clone()) {
@@ -489,6 +494,23 @@ pub trait TypeInfoQueryVisitor<T = DefaultVisitorContext> {
489494
fn enter_field(&self, _node: &query::Field, _visitor_context: &mut T, _type_info: &TypeInfo) {}
490495
fn leave_field(&self, _node: &query::Field, _visitor_context: &mut T, _type_info: &TypeInfo) {}
491496

497+
fn enter_directive(
498+
&self,
499+
_directive: &Directive,
500+
_parent_field: &query::Field,
501+
_visitor_context: &mut T,
502+
_type_info: &TypeInfo,
503+
) {
504+
}
505+
fn leave_directive(
506+
&self,
507+
_directive: &Directive,
508+
_parent_field: &query::Field,
509+
_visitor_context: &mut T,
510+
_type_info: &TypeInfo,
511+
) {
512+
}
513+
492514
fn enter_field_argument(
493515
&self,
494516
_name: &String,

src/validation/rules/defaults.rs

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

33
use super::{
4-
FieldsOnCorrectType, FragmentsOnCompositeTypes, KnownFragmentNames, KnownTypeNames,
5-
LeafFieldSelections, LoneAnonymousOperation, NoFragmentsCycle, NoUndefinedVariables,
6-
NoUnusedFragments, OverlappingFieldsCanBeMerged, PossibleFragmentSpreads,
4+
FieldsOnCorrectType, FragmentsOnCompositeTypes, KnownArgumentNames, KnownFragmentNames,
5+
KnownTypeNames, LeafFieldSelections, LoneAnonymousOperation, NoFragmentsCycle,
6+
NoUndefinedVariables, NoUnusedFragments, OverlappingFieldsCanBeMerged, PossibleFragmentSpreads,
77
SingleFieldSubscriptions, UniqueFragmentNames, UniqueOperationNames, VariablesAreInputTypes,
88
};
99

@@ -25,6 +25,7 @@ pub fn default_rules_validation_plan() -> ValidationPlan {
2525
plan.add_rule(Box::new(NoFragmentsCycle {}));
2626
plan.add_rule(Box::new(PossibleFragmentSpreads {}));
2727
plan.add_rule(Box::new(NoUndefinedVariables {}));
28+
plan.add_rule(Box::new(KnownArgumentNames {}));
2829

2930
plan
3031
}

0 commit comments

Comments
 (0)