Skip to content

Commit 811ac74

Browse files
authored
ValuesOfCorrectType (#32)
1 parent 8d32ea8 commit 811ac74

File tree

7 files changed

+1991
-40
lines changed

7 files changed

+1991
-40
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ cargo add graphql-tools
6363
- [ ] UniqueDirectivesPerLocation
6464
- [x] KnownArgumentNames
6565
- [x] UniqueArgumentNames
66-
- [ ] ValuesOfCorrectType
66+
- [x] ValuesOfCorrectType
6767
- [x] ProvidedRequiredArguments
6868
- [x] VariablesInAllowedPosition
6969
- [x] OverlappingFieldsCanBeMerged

src/ast/ext.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,6 @@ impl TypeDefinitionExtension for schema::TypeDefinition {
581581
match self {
582582
schema::TypeDefinition::Scalar(_u) => true,
583583
schema::TypeDefinition::Enum(_u) => true,
584-
schema::TypeDefinition::InputObject(_u) => false,
585584
_ => false,
586585
}
587586
}

src/ast/operation_visitor.rs

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ impl<'a> OperationVisitorContext<'a> {
101101
self.type_stack.last().unwrap_or(&None).as_ref()
102102
}
103103

104+
pub fn current_input_type(&self) -> Option<&schema::TypeDefinition> {
105+
self.input_type_stack.last().unwrap_or(&None).as_ref()
106+
}
107+
104108
pub fn current_parent_type(&self) -> Option<&schema::TypeDefinition> {
105109
self.parent_type_stack.last().unwrap_or(&None).as_ref()
106110
}
@@ -227,32 +231,20 @@ fn visit_input_value<'a, Visitor, UserContext>(
227231
Visitor: OperationVisitor<'a, UserContext>,
228232
{
229233
match input_value {
230-
Value::Boolean(v) => {
231-
visitor.enter_scalar_value(context, user_context, v);
232-
visitor.leave_scalar_value(context, user_context, v);
233-
}
234-
Value::Float(v) => {
235-
visitor.enter_scalar_value(context, user_context, v);
236-
visitor.leave_scalar_value(context, user_context, v);
237-
}
238-
Value::Int(v) => {
239-
visitor.enter_scalar_value(context, user_context, v);
240-
visitor.leave_scalar_value(context, user_context, v);
234+
Value::Boolean(_) | Value::Float(_) | Value::Int(_) | Value::String(_) => {
235+
visitor.enter_scalar_value(context, user_context, input_value);
236+
visitor.leave_scalar_value(context, user_context, input_value);
241237
}
242238
Value::Null => {
243239
visitor.enter_null_value(context, user_context, ());
244240
visitor.leave_null_value(context, user_context, ());
245241
}
246-
Value::String(v) => {
247-
visitor.enter_scalar_value(context, user_context, v);
248-
visitor.leave_scalar_value(context, user_context, v);
249-
}
250242
Value::Enum(v) => {
251-
visitor.enter_enum_value(context, user_context, v.clone());
252-
visitor.leave_enum_value(context, user_context, v.clone());
243+
visitor.enter_enum_value(context, user_context, v);
244+
visitor.leave_enum_value(context, user_context, v);
253245
}
254246
Value::List(v) => {
255-
visitor.enter_list_value(context, user_context, v.clone());
247+
visitor.enter_list_value(context, user_context, v);
256248

257249
let input_type = context.current_input_type_literal().and_then(|t| match t {
258250
Type::ListType(inner_type) => Some(inner_type.as_ref().clone()),
@@ -265,10 +257,10 @@ fn visit_input_value<'a, Visitor, UserContext>(
265257
}
266258
});
267259

268-
visitor.leave_list_value(context, user_context, v.clone());
260+
visitor.leave_list_value(context, user_context, v);
269261
}
270262
Value::Object(v) => {
271-
visitor.enter_object_value(context, user_context, v.clone());
263+
visitor.enter_object_value(context, user_context, v);
272264

273265
for (sub_key, sub_value) in v.iter() {
274266
let input_type = context
@@ -285,11 +277,11 @@ fn visit_input_value<'a, Visitor, UserContext>(
285277
});
286278
}
287279

288-
visitor.leave_object_value(context, user_context, v.clone());
280+
visitor.leave_object_value(context, user_context, v);
289281
}
290282
Value::Variable(v) => {
291-
visitor.enter_variable_value(context, user_context, v.clone());
292-
visitor.leave_variable_value(context, user_context, v.clone());
283+
visitor.enter_variable_value(context, user_context, v);
284+
visitor.leave_variable_value(context, user_context, v);
293285
}
294286
}
295287
}
@@ -599,78 +591,78 @@ pub trait OperationVisitor<'a, UserContext = ()> {
599591
) {
600592
}
601593

602-
fn enter_scalar_value<T>(
594+
fn enter_scalar_value(
603595
&mut self,
604596
_: &mut OperationVisitorContext<'a>,
605597
_: &mut UserContext,
606-
_: T,
598+
_: &Value,
607599
) {
608600
}
609-
fn leave_scalar_value<T>(
601+
fn leave_scalar_value(
610602
&mut self,
611603
_: &mut OperationVisitorContext<'a>,
612604
_: &mut UserContext,
613-
_: T,
605+
_: &Value,
614606
) {
615607
}
616608

617609
fn enter_enum_value(
618610
&mut self,
619611
_: &mut OperationVisitorContext<'a>,
620612
_: &mut UserContext,
621-
_: String,
613+
_: &String,
622614
) {
623615
}
624616
fn leave_enum_value(
625617
&mut self,
626618
_: &mut OperationVisitorContext<'a>,
627619
_: &mut UserContext,
628-
_: String,
620+
_: &String,
629621
) {
630622
}
631623

632624
fn enter_variable_value(
633625
&mut self,
634626
_: &mut OperationVisitorContext<'a>,
635627
_: &mut UserContext,
636-
_: String,
628+
_: &String,
637629
) {
638630
}
639631
fn leave_variable_value(
640632
&mut self,
641633
_: &mut OperationVisitorContext<'a>,
642634
_: &mut UserContext,
643-
_: String,
635+
_: &String,
644636
) {
645637
}
646638

647639
fn enter_list_value(
648640
&mut self,
649641
_: &mut OperationVisitorContext<'a>,
650642
_: &mut UserContext,
651-
_: Vec<Value>,
643+
_: &Vec<Value>,
652644
) {
653645
}
654646
fn leave_list_value(
655647
&mut self,
656648
_: &mut OperationVisitorContext<'a>,
657649
_: &mut UserContext,
658-
_: Vec<Value>,
650+
_: &Vec<Value>,
659651
) {
660652
}
661653

662654
fn enter_object_value(
663655
&mut self,
664656
_: &mut OperationVisitorContext<'a>,
665657
_: &mut UserContext,
666-
_: BTreeMap<String, Value>,
658+
_: &BTreeMap<String, Value>,
667659
) {
668660
}
669661
fn leave_object_value(
670662
&mut self,
671663
_: &mut OperationVisitorContext<'a>,
672664
_: &mut UserContext,
673-
_: BTreeMap<String, Value>,
665+
_: &BTreeMap<String, Value>,
674666
) {
675667
}
676668

src/validation/rules/defaults.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use super::{
66
NoFragmentsCycle, NoUndefinedVariables, NoUnusedFragments, NoUnusedVariables,
77
OverlappingFieldsCanBeMerged, PossibleFragmentSpreads, ProvidedRequiredArguments,
88
SingleFieldSubscriptions, UniqueArgumentNames, UniqueFragmentNames, UniqueOperationNames,
9-
UniqueVariableNames, VariablesAreInputTypes, VariablesInAllowedPosition,
9+
UniqueVariableNames, ValuesOfCorrectType, VariablesAreInputTypes, VariablesInAllowedPosition,
1010
};
1111

1212
pub fn default_rules_validation_plan() -> ValidationPlan {
@@ -34,6 +34,7 @@ pub fn default_rules_validation_plan() -> ValidationPlan {
3434
plan.add_rule(Box::new(ProvidedRequiredArguments::new()));
3535
plan.add_rule(Box::new(KnownDirectives::new()));
3636
plan.add_rule(Box::new(VariablesInAllowedPosition::new()));
37+
plan.add_rule(Box::new(ValuesOfCorrectType::new()));
3738

3839
plan
3940
}

src/validation/rules/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub mod unique_argument_names;
2121
pub mod unique_fragment_names;
2222
pub mod unique_operation_names;
2323
pub mod unique_variable_names;
24+
pub mod values_of_correct_type;
2425
pub mod variables_are_input_types;
2526
pub mod variables_in_allowed_position;
2627

@@ -47,5 +48,6 @@ pub use self::unique_argument_names::*;
4748
pub use self::unique_fragment_names::*;
4849
pub use self::unique_operation_names::*;
4950
pub use self::unique_variable_names::*;
51+
pub use self::values_of_correct_type::*;
5052
pub use self::variables_are_input_types::*;
5153
pub use self::variables_in_allowed_position::*;

0 commit comments

Comments
 (0)