async-graphql/src/validation/rules/default_values_of_correct_type.rs

38 lines
1.4 KiB
Rust
Raw Normal View History

use crate::context::QueryPathNode;
2020-03-08 12:58:22 +00:00
use crate::validation::utils::is_valid_input_value;
2020-03-24 10:54:22 +00:00
use crate::validation::visitor::{Visitor, VisitorContext};
use crate::QueryPathSegment;
2020-03-08 12:58:22 +00:00
use graphql_parser::query::{Type, VariableDefinition};
pub struct DefaultValuesOfCorrectType;
impl<'a> Visitor<'a> for DefaultValuesOfCorrectType {
fn enter_variable_definition(
&mut self,
2020-03-22 08:45:59 +00:00
ctx: &mut VisitorContext<'a>,
2020-03-08 12:58:22 +00:00
variable_definition: &'a VariableDefinition,
) {
if let Some(value) = &variable_definition.default_value {
if let Type::NonNullType(_) = variable_definition.var_type {
ctx.report_error(vec![variable_definition.position],format!(
2020-03-09 12:39:46 +00:00
"Argument \"{}\" has type \"{}\" and is not nullable, so it't can't have a default value",
2020-03-08 12:58:22 +00:00
variable_definition.name, variable_definition.var_type,
));
} else if let Some(reason) = is_valid_input_value(
2020-03-21 01:32:13 +00:00
ctx.registry,
&variable_definition.var_type.to_string(),
value,
QueryPathNode {
parent: None,
segment: QueryPathSegment::Name(&variable_definition.name),
},
2020-03-21 01:32:13 +00:00
) {
ctx.report_error(
vec![variable_definition.position],
format!("Invalid default value for argument {}", reason),
2020-03-21 01:32:13 +00:00
)
2020-03-08 12:58:22 +00:00
}
}
}
}