diff --git a/src/executor_tests/enums.rs b/src/executor_tests/enums.rs index f6984490..4eab8f87 100644 --- a/src/executor_tests/enums.rs +++ b/src/executor_tests/enums.rs @@ -96,7 +96,7 @@ fn does_not_accept_string_literals() { #[test] fn accepts_strings_in_variables() { run_variable_query( - "{ toString(color: RED) }", + "query q($color: Color!) { toString(color: $color) }", vec![ ("color".to_owned(), InputValue::string("RED")), ].into_iter().collect(), diff --git a/src/macros/enums.rs b/src/macros/enums.rs index 8b7ec829..be143d23 100644 --- a/src/macros/enums.rs +++ b/src/macros/enums.rs @@ -94,7 +94,7 @@ macro_rules! graphql_enum { impl $crate::FromInputValue for $name { fn from(v: &$crate::InputValue) -> Option<$name> { - match v.as_enum_value() { + match v.as_enum_value().or_else(|| v.as_string_value()) { $( Some(graphql_enum!(@as_pattern, $ename)) => Some(graphql_enum!(@as_expr, $eval)), )* diff --git a/src/types/utilities.rs b/src/types/utilities.rs index d2b16dab..1f866553 100644 --- a/src/types/utilities.rs +++ b/src/types/utilities.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use ast::InputValue; use schema::model::{SchemaType, TypeType}; -use schema::meta::{MetaType, InputObjectMeta}; +use schema::meta::{MetaType, InputObjectMeta, EnumMeta}; pub fn is_valid_literal_value(schema: &SchemaType, arg_type: &TypeType, arg_value: &InputValue) -> bool { match *arg_type { @@ -20,6 +20,13 @@ pub fn is_valid_literal_value(schema: &SchemaType, arg_type: &TypeType, arg_valu } } TypeType::Concrete(t) => { + // Even though InputValue::String can be parsed into an enum, they + // are not valid as enum *literals* in a GraphQL query. + match (arg_value, arg_type.to_concrete()) { + (&InputValue::String(_), Some(&MetaType::Enum(EnumMeta { .. }))) => return false, + _ => () + } + match *arg_value { ref v @ InputValue::Null | ref v @ InputValue::Int(_) |