1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use crate::parser::types::VariableDefinition;
use crate::validation::visitor::{Visitor, VisitorContext};
use crate::Positioned;
#[derive(Default)]
pub struct VariablesAreInputTypes;
impl<'a> Visitor<'a> for VariablesAreInputTypes {
fn enter_variable_definition(
&mut self,
ctx: &mut VisitorContext<'a>,
variable_definition: &'a Positioned<VariableDefinition>,
) {
if let Some(ty) = ctx
.registry
.concrete_type_by_parsed_type(&variable_definition.node.var_type.node)
{
if !ty.is_input() {
ctx.report_error(
vec![variable_definition.pos],
format!(
"Variable \"{}\" cannot be of non-input type \"{}\"",
variable_definition.node.name.node,
ty.name()
),
);
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
pub fn factory() -> VariablesAreInputTypes {
VariablesAreInputTypes
}
#[test]
fn input_types_are_valid() {
expect_passes_rule!(
factory,
r#"
query Foo($a: String, $b: [Boolean!]!, $c: ComplexInput) {
field(a: $a, b: $b, c: $c)
}
"#,
);
}
#[test]
fn output_types_are_invalid() {
expect_fails_rule!(
factory,
r#"
query Foo($a: Dog, $b: [[CatOrDog!]]!, $c: Pet) {
field(a: $a, b: $b, c: $c)
}
"#,
);
}
}