1616 overload ,
1717)
1818
19+ from ..error import GraphQLError
1920from ..language import (
2021 EnumTypeDefinitionNode ,
2122 EnumValueDefinitionNode ,
3940 UnionTypeDefinitionNode ,
4041 UnionTypeExtensionNode ,
4142 ValueNode ,
43+ print_ast ,
4244)
4345from ..pyutils import (
4446 AwaitableOrValue ,
4547 FrozenList ,
4648 Path ,
4749 cached_property ,
50+ did_you_mean ,
4851 inspect ,
4952 is_collection ,
5053 is_description ,
54+ suggestion_list ,
5155 Undefined ,
52- UndefinedType ,
5356)
5457from ..utilities .value_from_ast_untyped import value_from_ast_untyped
5558
@@ -1100,40 +1103,56 @@ def _value_lookup(self) -> Dict[Any, str]:
11001103 pass # ignore unhashable values
11011104 return lookup
11021105
1103- def serialize (self , output_value : Any ) -> Union [ str , None , UndefinedType ] :
1106+ def serialize (self , output_value : Any ) -> str :
11041107 try :
1105- return self ._value_lookup .get (output_value , Undefined )
1106- except TypeError : # unhashable value
1108+ return self ._value_lookup [output_value ]
1109+ except KeyError : # hashable value not found
1110+ pass
1111+ except TypeError : # unhashable value, we need to scan all values
11071112 for enum_name , enum_value in self .values .items ():
11081113 if enum_value .value == output_value :
11091114 return enum_name
1110- return Undefined
1115+ raise GraphQLError (
1116+ f"Enum '{ self .name } ' cannot represent value: { inspect (output_value )} "
1117+ )
11111118
11121119 def parse_value (self , input_value : str ) -> Any :
11131120 if isinstance (input_value , str ):
11141121 try :
11151122 enum_value = self .values [input_value ]
11161123 except KeyError :
1117- return Undefined
1118- if enum_value .value is None or enum_value .value is Undefined :
1119- return input_value
1124+ raise GraphQLError (
1125+ f"Value '{ input_value } ' does not exist in '{ self .name } ' enum."
1126+ + did_you_mean_enum_value (self , input_value )
1127+ )
11201128 return enum_value .value
1121- return Undefined
1129+ value_str = inspect (input_value )
1130+ raise GraphQLError (
1131+ f"Enum '{ self .name } ' cannot represent non-string value: { value_str } ."
1132+ + did_you_mean_enum_value (self , value_str )
1133+ )
11221134
11231135 def parse_literal (
11241136 self , value_node : ValueNode , _variables : Optional [Dict [str , Any ]] = None
11251137 ) -> Any :
11261138 # Note: variables will be resolved before calling this method.
11271139 if isinstance (value_node , EnumValueNode ):
1128- value = value_node .value
11291140 try :
1130- enum_value = self .values [value ]
1141+ enum_value = self .values [value_node . value ]
11311142 except KeyError :
1132- return Undefined
1133- if enum_value .value is None or enum_value .value is Undefined :
1134- return value
1143+ value_str = print_ast (value_node )
1144+ raise GraphQLError (
1145+ f"Value '{ value_str } ' does not exist in '{ self .name } ' enum."
1146+ + did_you_mean_enum_value (self , value_str ),
1147+ value_node ,
1148+ )
11351149 return enum_value .value
1136- return Undefined
1150+ value_str = print_ast (value_node )
1151+ raise GraphQLError (
1152+ f"Enum '{ self .name } ' cannot represent non-enum value: { value_str } ."
1153+ + did_you_mean_enum_value (self , value_str ),
1154+ value_node ,
1155+ )
11371156
11381157
11391158def is_enum_type (type_ : Any ) -> bool :
@@ -1146,6 +1165,11 @@ def assert_enum_type(type_: Any) -> GraphQLEnumType:
11461165 return cast (GraphQLEnumType , type_ )
11471166
11481167
1168+ def did_you_mean_enum_value (enum_type : GraphQLEnumType , unknown_value_str : str ) -> str :
1169+ suggested_values = suggestion_list (unknown_value_str , enum_type .values )
1170+ return did_you_mean (suggested_values , "the enum value" )
1171+
1172+
11491173class GraphQLEnumValue :
11501174
11511175 value : Any
0 commit comments