Class: GraphQL::EnumType

Inherits:
BaseType show all
Defined in:
lib/graphql/enum_type.rb

Overview

Represents a collection of related values. By convention, enum names are `SCREAMING_CASE_NAMES`, but other identifiers are supported too.

You can use as return types or as inputs.

By default, enums are passed to `resolve` functions as the strings that identify them, but you can provide a custom Ruby value with the `value:` keyword.

Examples:

An enum of programming languages

LanguageEnum = GraphQL::EnumType.define do
  name "Languages"
  description "Programming languages for Web projects"
  value("PYTHON", "A dynamic, function-oriented language")
  value("RUBY", "A very dynamic language aimed at programmer happiness")
  value("JAVASCRIPT", "Accidental lingua franca of the web")
end

Using an enum as a return type

field :favoriteLanguage, LanguageEnum, "This person's favorite coding language"
# ...
# In a query:
Schema.execute("{ coder(id: 1) { favoriteLanguage } }")
# { "data" => { "coder" => { "favoriteLanguage" => "RUBY" } } }

Defining an enum input

field :coders, types[CoderType] do
  argument :knowing, types[LanguageType]
  resolve ->(obj, args, ctx) {
    Coder.where(language: args[:knowing])
  }
end

Using an enum as input

{
  # find coders who know Python and Ruby
  coders(knowing: [PYTHON, RUBY]) {
    name
    hourlyRate
  }
}

Enum whose values are different in Ruby-land

GraphQL::EnumType.define do
  # ...
  # use the `value:` keyword:
  value("RUBY", "Lisp? Smalltalk?", value: :rb)
end

# Now, resolve functions will receive `:rb` instead of `"RUBY"`
field :favoriteLanguage, LanguageEnum
resolve ->(obj, args, ctx) {
  args[:favoriteLanguage] # => :rb
}

Defined Under Namespace

Classes: EnumValue

Instance Attribute Summary

Attributes inherited from BaseType

#description, #name

Instance Method Summary collapse

Methods inherited from BaseType

#==, #coerce_input, #connection_type, #define_connection, #define_edge, #edge_type, #get_field, resolve_related_type, #resolve_type, #to_list_type, #to_non_null_type, #unwrap, #valid_input?, #validate_input

Methods included from Define::InstanceDefinable

#define, #definition_proc=, included, #metadata

Methods included from Define::NonNullWithBang

#!

Constructor Details

#initializeEnumType

Returns a new instance of EnumType.


61
62
63
64
# File 'lib/graphql/enum_type.rb', line 61

def initialize
  @values_by_name = {}
  @values_by_value = {}
end

Instance Method Details

#add_value(enum_value) ⇒ Object

Parameters:

  • enum_value (EnumValue)

    A value to add to this type's set of values


74
75
76
77
# File 'lib/graphql/enum_type.rb', line 74

def add_value(enum_value)
  @values_by_name[enum_value.name] = enum_value
  @values_by_value[enum_value.value] = enum_value
end

#coerce_non_null_input(value_name) ⇒ Object

Get the underlying value for this enum value

Examples:

get episode value from Enum

episode = EpisodeEnum.coerce("NEWHOPE")
episode # => 6

Parameters:

  • value_name (String)

    the string representation of this enum value

Returns:

  • (Object)

    the underlying value for this enum value


108
109
110
111
112
113
114
115
# File 'lib/graphql/enum_type.rb', line 108

def coerce_non_null_input(value_name)
  ensure_defined
  if @values_by_name.key?(value_name)
    @values_by_name.fetch(value_name).value
  else
    nil
  end
end

#coerce_result(value) ⇒ Object


117
118
119
120
# File 'lib/graphql/enum_type.rb', line 117

def coerce_result(value)
  ensure_defined
  @values_by_value.fetch(value).name
end

#kindObject


85
86
87
# File 'lib/graphql/enum_type.rb', line 85

def kind
  GraphQL::TypeKinds::ENUM
end

#to_sObject


122
123
124
# File 'lib/graphql/enum_type.rb', line 122

def to_s
  name
end

#validate_non_null_input(value_name) ⇒ Object


89
90
91
92
93
94
95
96
97
98
# File 'lib/graphql/enum_type.rb', line 89

def validate_non_null_input(value_name)
  ensure_defined
  result = GraphQL::Query::InputValidationResult.new

  if !@values_by_name.key?(value_name)
    result.add_problem("Expected #{JSON.generate(value_name, quirks_mode: true)} to be one of: #{@values_by_name.keys.join(', ')}")
  end

  result
end

#valuesHash<String => EnumValue>

Returns `=> value` pairs contained in this type.

Returns:


80
81
82
83
# File 'lib/graphql/enum_type.rb', line 80

def values
  ensure_defined
  @values_by_name
end

#values=(new_values) ⇒ Object

Parameters:

  • new_values (Array<EnumValue>)

    The set of values contained in this type


67
68
69
70
71
# File 'lib/graphql/enum_type.rb', line 67

def values=(new_values)
  @values_by_name = {}
  @values_by_value = {}
  new_values.each { |enum_value| add_value(enum_value) }
end