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 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

#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



72
73
74
75
# File 'lib/graphql/enum_type.rb', line 72

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



105
106
107
108
109
110
111
112
# File 'lib/graphql/enum_type.rb', line 105

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



114
115
116
117
# File 'lib/graphql/enum_type.rb', line 114

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

#kindObject



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

def kind
  GraphQL::TypeKinds::ENUM
end

#to_sObject



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

def to_s
  name
end

#validate_non_null_input(value_name) ⇒ Object



86
87
88
89
90
91
92
93
94
95
# File 'lib/graphql/enum_type.rb', line 86

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.dump(value_name)} to be one of: #{@values_by_name.keys.join(', ')}")
  end

  result
end

#valuesObject



77
78
79
80
# File 'lib/graphql/enum_type.rb', line 77

def values
  ensure_defined
  @values_by_name
end

#values=(new_values) ⇒ Object



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

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