class GraphQL::Schema::Enum
Extend this class to define GraphQL enums in your schema.
By default, GraphQL enum values are translated into Ruby strings. You can provide a custom value with the value: keyword.
Examples
Example: # equivalent to
# enum PizzaTopping { # MUSHROOMS # ONIONS # PEPPERS # } class PizzaTopping < GraphQL::Schema::Enum value :MUSHROOMS value :ONIONS value :PEPPERS end
Public Class Methods
# File lib/graphql/schema/enum.rb, line 157 def all_enum_value_definitions all_defns = if superclass.respond_to?(:all_enum_value_definitions) superclass.all_enum_value_definitions else [] end @own_values && @own_values.each do |_key, value| if value.is_a?(Array) all_defns.concat(value) else all_defns << value end end all_defns end
Returns
-
Array<Schema::EnumValue>β An unfiltered list of all definitions
# File lib/graphql/schema/enum.rb, line 277 def coerce_input(value_name, ctx) all_values = ctx.types ? ctx.types.enum_values(self) : values.each_value # This tries matching by incoming GraphQL string, then checks Ruby-defined values if v = (all_values.find { |val| val.graphql_name == value_name } || all_values.find { |val| val.value == value_name }) if v.authorized?(ctx) v.value else raise GraphQL::UnauthorizedEnumValueError.new(type: self, enum_value: v, context: ctx) end else nil end end
Called by the runtime with incoming string representations from a query. It will match the string to a configured by name or by Ruby value.
Parameters
-
value_name(String, Object) β A string from aGraphQLquery, or a Ruby value matching avalue(..., value: ...)configuration -
ctx(GraphQL::Query::Context)
Raises
-
GraphQL::UnauthorizedEnumValueErrorβ if anEnumValuematches but returns false for.authorized?. Goes toSchema.unauthorized_object.
Returns
-
Objectβ The Ruby value for the matchedGraphQL::Schema::EnumValue
# File lib/graphql/schema/enum.rb, line 248 def coerce_result(value, ctx) types = ctx.types all_values = types ? types.enum_values(self) : values.each_value enum_value = all_values.find { |val| val.value == value } if enum_value && (was_authed = enum_value.authorized?(ctx)) enum_value.graphql_name else raise const_get(:UnresolvedValueError).new(enum: self, value: value, context: ctx, authorized: was_authed) end end
Called by the runtime when a field returns a value to give back to the client. This method checks that the incoming value matches one of the enumβs defined values.
Parameters
-
value(Object) β Any value matching the values for this enum. -
ctx(GraphQL::Query::Context)
Raises
-
GraphQL::Schema::Enum::UnresolvedValueErrorβ ifvaluedoesnβt match a configured value or if the matching value isnβt authorized.
Returns
-
Stringβ The GraphQL-ready string forvalue
# File lib/graphql/schema/enum.rb, line 191 def enum_value_class(new_enum_value_class = nil) if new_enum_value_class @enum_value_class = new_enum_value_class elsif defined?(@enum_value_class) && @enum_value_class @enum_value_class else superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil end end
Returns
-
Classβ for handlingvalue(...)inputs and buildingGraphQL::Enum::EnumValues out of them
# File lib/graphql/schema/enum.rb, line 115 def enum_values(context = GraphQL::Query::NullContext.instance) inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil visible_values = [] types = Warden.types_from_context(context) own_values.each do |key, values_entry| visible_value = nil #: GraphQL::Schema::EnumValue? if values_entry.is_a?(Array) values_entry.each do |v| if types.visible_enum_value?(v, context) if visible_value.nil? visible_value = v visible_values << v else raise DuplicateNamesError.new( duplicated_name: v.path, duplicated_definition_1: visible_value.inspect, duplicated_definition_2: v.inspect ) end end end elsif types.visible_enum_value?(values_entry, context) visible_values << values_entry end end if inherited_values # Local values take precedence over inherited ones inherited_values.each do |i_val| if !visible_values.any? { |v| v.graphql_name == i_val.graphql_name } visible_values << i_val end end end visible_values end
Returns
-
Array<GraphQL::Schema::EnumValue>β Possible values of this enum
Source
# File lib/graphql/schema/enum.rb, line 292 def inherited(child_class) if child_class.name # Don't assign a custom error class to anonymous classes # because they would end up with names like `#<Class0x1234>::UnresolvedValueError` which messes up bug trackers child_class.const_set(:UnresolvedValueError, Class.new(Schema::Enum::UnresolvedValueError)) end child_class.class_exec { @value_methods = nil } super end
# File lib/graphql/schema/enum.rb, line 217 def validate_non_null_input(value_name, ctx, max_errors: nil) allowed_values = ctx.types.enum_values(self) matching_value = allowed_values.find { |v| v.graphql_name == value_name } if matching_value.nil? GraphQL::Query::InputValidationResult.from_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:graphql_name).join(', ')}") else nil end # rescue MissingValuesError # nil end
# File lib/graphql/schema/enum.rb, line 86 def value(*args, value_method: nil, **kwargs, &block) kwargs[:owner] = self value = enum_value_class.new(*args, **kwargs, &block) if value_method || (value_methods && value_method != false) generate_value_method(value, value_method) end key = value.graphql_name prev_value = own_values[key] case prev_value when nil own_values[key] = value when GraphQL::Schema::EnumValue own_values[key] = [prev_value, value] when Array prev_value << value else raise "Invariant: Unexpected enum value for #{key.inspect}: #{prev_value.inspect}" end value end
Define a value for this enum See Schema::EnumValue which handles these inputs by default
Options
-
kwargs.:graphql_name(String, Symbol) β theGraphQLvalue for this, usuallySCREAMING_CASE -
kwargs.:description,(String) β theGraphQLdescription for this value, present in documentation -
kwargs.:comment,(String) β theGraphQLcomment for this value, present in documentation -
kwargs.:value(::Object) β the translated Ruby value for this object (defaults tographql_name) -
kwargs.:value_method,(::Object) β the method name to fetchgraphql_name(defaults tographql_name.downcase) -
kwargs.:deprecation_reason(String) β if this object is deprecated, include a message here
Parameters
-
value_method(Symbol, false) β A method to generate for this value, orfalseto skip generation
Returns
-
void
# File lib/graphql/schema/enum.rb, line 201 def value_methods(new_value = NOT_CONFIGURED) if NOT_CONFIGURED.equal?(new_value) if @value_methods != nil @value_methods else find_inherited_value(:value_methods, false) end else @value_methods = new_value end end
# File lib/graphql/schema/enum.rb, line 181 def values(context = GraphQL::Query::NullContext.instance) enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val } end
Returns
-
Hash<String => GraphQL::Schema::EnumValue>β Possible values of this enum, keyed by name.