Skip to content

Commit de7e8b8

Browse files
committed
added error_code to valiation rules and errors, to allow to distingiush the error rule
1 parent 6ae60c2 commit de7e8b8

27 files changed

+145
-36
lines changed

src/validation/rules/fields_on_correct_type.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FieldsOnCorrectType {
3232
if let Selection::Field(field) = selection {
3333
if field.name == "__typename" {
3434
user_context.report_error(ValidationError {
35+
error_code: self.error_code(),
3536
message: "`__typename` may not be included as a root field in a subscription operation".to_string(),
3637
locations: vec![subscription.position],
3738
});
@@ -57,6 +58,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FieldsOnCorrectType {
5758

5859
if let None = parent_type.field_by_name(field_name) {
5960
user_context.report_error(ValidationError {
61+
error_code: self.error_code(),
6062
locations: vec![field.position],
6163
message: format!(
6264
"Cannot query field \"{}\" on type \"{}\".",
@@ -69,6 +71,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FieldsOnCorrectType {
6971
}
7072

7173
impl ValidationRule for FieldsOnCorrectType {
74+
fn error_code<'a>(&self) -> &'a str {
75+
"FieldsOnCorrectType"
76+
}
77+
7278
fn validate<'a>(
7379
&self,
7480
ctx: &'a mut OperationVisitorContext,

src/validation/rules/fragments_on_composite_types.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FragmentsOnCompositeTy
3333
if !gql_type.is_composite_type() {
3434
user_context.report_error(ValidationError {
3535
locations: vec![inline_fragment.position],
36+
error_code: self.error_code(),
3637
message: format!(
3738
"Fragment cannot condition on non composite type \"{}\".",
3839
type_condition
@@ -55,6 +56,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FragmentsOnCompositeTy
5556
if !gql_type.is_composite_type() {
5657
user_context.report_error(ValidationError {
5758
locations: vec![fragment_definition.position],
59+
error_code: self.error_code(),
5860
message: format!(
5961
"Fragment \"{}\" cannot condition on non composite type \"{}\".",
6062
fragment_definition.name, type_condition
@@ -66,6 +68,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for FragmentsOnCompositeTy
6668
}
6769

6870
impl ValidationRule for FragmentsOnCompositeTypes {
71+
fn error_code<'a>(&self) -> &'a str {
72+
"FragmentsOnCompositeTypes"
73+
}
74+
6975
fn validate<'a>(
7076
&self,
7177
ctx: &'a mut OperationVisitorContext,

src/validation/rules/known_argument_names.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownArgumentNames<'a>
9797
match arg_position {
9898
ArgumentParent::Field(field_name, type_name) => {
9999
user_context.report_error(ValidationError {
100+
error_code: self.error_code(),
100101
message: format!(
101102
"Unknown argument \"{}\" on field \"{}.{}\".",
102103
argument_name,
@@ -108,6 +109,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownArgumentNames<'a>
108109
}
109110
ArgumentParent::Directive(directive_name) => {
110111
user_context.report_error(ValidationError {
112+
error_code: self.error_code(),
111113
message: format!(
112114
"Unknown argument \"{}\" on directive \"@{}\".",
113115
argument_name, directive_name
@@ -122,6 +124,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownArgumentNames<'a>
122124
}
123125

124126
impl<'k> ValidationRule for KnownArgumentNames<'k> {
127+
fn error_code<'a>(&self) -> &'a str {
128+
"KnownArgumentNames"
129+
}
130+
125131
fn validate<'a>(
126132
&self,
127133
ctx: &'a mut OperationVisitorContext,

src/validation/rules/known_directives.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownDirectives {
133133
.iter()
134134
.any(|l| l == current_location)
135135
{
136-
user_context.report_error(ValidationError {
136+
user_context.report_error(ValidationError {error_code: self.error_code(),
137137
locations: vec![directive.position],
138138
message: format!(
139139
"Directive \"@{}\" may not be used on {}",
@@ -144,7 +144,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownDirectives {
144144
}
145145
}
146146
} else {
147-
user_context.report_error(ValidationError {
147+
user_context.report_error(ValidationError {error_code: self.error_code(),
148148
locations: vec![directive.position],
149149
message: format!("Unknown directive \"@{}\".", directive.name),
150150
});
@@ -153,6 +153,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownDirectives {
153153
}
154154

155155
impl ValidationRule for KnownDirectives {
156+
fn error_code<'a>(&self) -> &'a str {
157+
"KnownDirectives"
158+
}
159+
156160
fn validate<'a>(
157161
&self,
158162
ctx: &'a mut OperationVisitorContext,

src/validation/rules/known_fragment_names.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownFragmentNames {
2828
.known_fragments
2929
.get(fragment_spread.fragment_name.as_str())
3030
{
31-
None => user_context.report_error(ValidationError {
31+
None => user_context.report_error(ValidationError {error_code: self.error_code(),
3232
locations: vec![fragment_spread.position],
3333
message: format!("Unknown fragment \"{}\".", fragment_spread.fragment_name),
3434
}),
@@ -38,6 +38,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownFragmentNames {
3838
}
3939

4040
impl ValidationRule for KnownFragmentNames {
41+
fn error_code<'a>(&self) -> &'a str {
42+
"KnownFragmentNames"
43+
}
44+
4145
fn validate<'a>(
4246
&self,
4347
ctx: &'a mut OperationVisitorContext,

src/validation/rules/known_type_names.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownTypeNames {
3131

3232
if let None = visitor_context.schema.type_by_name(fragment_type_name) {
3333
if !fragment_type_name.starts_with("__") {
34-
user_context.report_error(ValidationError {
34+
user_context.report_error(ValidationError {error_code: self.error_code(),
3535
locations: vec![fragment_definition.position],
3636
message: format!("Unknown type \"{}\".", fragment_type_name),
3737
});
@@ -48,7 +48,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownTypeNames {
4848
if let Some(TypeCondition::On(fragment_type_name)) = &inline_fragment.type_condition {
4949
if let None = visitor_context.schema.type_by_name(fragment_type_name) {
5050
if !fragment_type_name.starts_with("__") {
51-
user_context.report_error(ValidationError {
51+
user_context.report_error(ValidationError {error_code: self.error_code(),
5252
locations: vec![inline_fragment.position],
5353
message: format!("Unknown type \"{}\".", fragment_type_name),
5454
});
@@ -67,7 +67,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownTypeNames {
6767

6868
if let None = visitor_context.schema.type_by_name(&base_type) {
6969
if !base_type.starts_with("__") {
70-
user_context.report_error(ValidationError {
70+
user_context.report_error(ValidationError {error_code: self.error_code(),
7171
locations: vec![variable_definition.position],
7272
message: format!("Unknown type \"{}\".", base_type),
7373
});
@@ -77,6 +77,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for KnownTypeNames {
7777
}
7878

7979
impl ValidationRule for KnownTypeNames {
80+
fn error_code<'a>(&self) -> &'a str {
81+
"KnownTypeNames"
82+
}
83+
8084
fn validate<'a>(
8185
&self,
8286
ctx: &'a mut OperationVisitorContext,

src/validation/rules/leaf_field_selections.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LeafFieldSelections {
3232

3333
if field_type.is_leaf_type() {
3434
if field_selection_count > 0 {
35-
user_context.report_error(ValidationError {
35+
user_context.report_error(ValidationError {error_code: self.error_code(),
3636
locations: vec![field.position],
3737
message: format!(
3838
"Field \"{}\" must not have a selection since type \"{}\" has no subfields.",
@@ -43,7 +43,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LeafFieldSelections {
4343
}
4444
} else {
4545
if field_selection_count == 0 {
46-
user_context.report_error(ValidationError {
46+
user_context.report_error(ValidationError {error_code: self.error_code(),
4747
locations: vec![field.position],
4848
message: format!(
4949
"Field \"{}\" of type \"{}\" must have a selection of subfields. Did you mean \"{} {{ ... }}\"?",
@@ -59,6 +59,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LeafFieldSelections {
5959
}
6060

6161
impl ValidationRule for LeafFieldSelections {
62+
fn error_code<'a>(&self) -> &'a str {
63+
"LeafFieldSelections"
64+
}
65+
6266
fn validate<'a>(
6367
&self,
6468
ctx: &'a mut OperationVisitorContext,

src/validation/rules/lone_anonymous_operation.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LoneAnonymousOperation
4040
match definition {
4141
Definition::Operation(OperationDefinition::SelectionSet(_)) => {
4242
if operations_count > 1 {
43-
user_context.report_error(ValidationError {
43+
user_context.report_error(ValidationError {error_code: self.error_code(),
4444
message: "This anonymous operation must be the only defined operation."
4545
.to_string(),
4646
locations: vec![],
@@ -49,7 +49,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LoneAnonymousOperation
4949
}
5050
Definition::Operation(OperationDefinition::Query(query)) => {
5151
if query.name == None && operations_count > 1 {
52-
user_context.report_error(ValidationError {
52+
user_context.report_error(ValidationError {error_code: self.error_code(),
5353
message: "This anonymous operation must be the only defined operation."
5454
.to_string(),
5555
locations: vec![query.position.clone()],
@@ -58,7 +58,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LoneAnonymousOperation
5858
}
5959
Definition::Operation(OperationDefinition::Mutation(mutation)) => {
6060
if mutation.name == None && operations_count > 1 {
61-
user_context.report_error(ValidationError {
61+
user_context.report_error(ValidationError {error_code: self.error_code(),
6262
message: "This anonymous operation must be the only defined operation."
6363
.to_string(),
6464
locations: vec![mutation.position.clone()],
@@ -67,7 +67,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LoneAnonymousOperation
6767
}
6868
Definition::Operation(OperationDefinition::Subscription(subscription)) => {
6969
if subscription.name == None && operations_count > 1 {
70-
user_context.report_error(ValidationError {
70+
user_context.report_error(ValidationError {error_code: self.error_code(),
7171
message: "This anonymous operation must be the only defined operation."
7272
.to_string(),
7373
locations: vec![subscription.position.clone()],
@@ -81,6 +81,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for LoneAnonymousOperation
8181
}
8282

8383
impl ValidationRule for LoneAnonymousOperation {
84+
fn error_code<'a>(&self) -> &'a str {
85+
"LoneAnonymousOperation"
86+
}
87+
8488
fn validate<'a>(
8589
&self,
8690
ctx: &'a mut OperationVisitorContext,

src/validation/rules/no_fragments_cycle.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ impl NoFragmentsCycle {
7373
.collect::<Vec<String>>(),
7474
};
7575

76-
error_context.report_error(ValidationError {
76+
error_context.report_error(ValidationError {error_code: self.error_code(),
7777
locations: cycle_path.iter().map(|f| f.position.clone()).collect(),
7878
message: match via_path.len() {
7979
0 => {
@@ -117,6 +117,10 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for NoFragmentsCycle {
117117
}
118118

119119
impl ValidationRule for NoFragmentsCycle {
120+
fn error_code<'a>(&self) -> &'a str {
121+
"NoFragmentsCycle"
122+
}
123+
120124
fn validate<'a>(
121125
&self,
122126
ctx: &'a mut OperationVisitorContext,

src/validation/rules/no_undefined_variables.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl<'a> OperationVisitor<'a, ValidationErrorContext> for NoUndefinedVariables<'
146146
);
147147

148148
unused.iter().for_each(|var| {
149-
user_context.report_error(ValidationError {
149+
user_context.report_error(ValidationError {error_code: self.error_code(),
150150
message: error_message(&var, op_name),
151151
locations: vec![],
152152
})
@@ -167,6 +167,10 @@ fn error_message(var_name: &str, op_name: &Option<&str>) -> String {
167167
}
168168

169169
impl<'n> ValidationRule for NoUndefinedVariables<'n> {
170+
fn error_code<'a>(&self) -> &'a str {
171+
"NoUndefinedVariables"
172+
}
173+
170174
fn validate<'a>(
171175
&self,
172176
ctx: &'a mut OperationVisitorContext,

0 commit comments

Comments
 (0)