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:

  • the string representation of this enum value

Returns:

  • 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