class GraphQL::Schema::Enum

Public Class Methods

all_enum_value_definitions() click to toggle source

@return [Array<Schema::EnumValue>] An unfiltered list of all definitions

# File lib/graphql/schema/enum.rb, line 88
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
coerce_input(value_name, ctx) click to toggle source
# File lib/graphql/schema/enum.rb, line 165
def coerce_input(value_name, ctx)
  all_values = ctx.warden ? ctx.warden.enum_values(self) : values.each_value

  if v = all_values.find { |val| val.graphql_name == value_name }
    v.value
  elsif v = all_values.find { |val| val.value == value_name }
    # this is for matching default values, which are "inputs", but they're
    # the Ruby value, not the GraphQL string.
    v.value
  else
    nil
  end
end
coerce_result(value, ctx) click to toggle source
# File lib/graphql/schema/enum.rb, line 154
def coerce_result(value, ctx)
  warden = ctx.warden
  all_values = warden ? warden.enum_values(self) : values.each_value
  enum_value = all_values.find { |val| val.value == value }
  if enum_value
    enum_value.graphql_name
  else
    raise self::UnresolvedValueError.new(enum: self, value: value, context: ctx)
  end
end
enum_value_class(new_enum_value_class = nil) click to toggle source

@return [Class] for handling `value(…)` inputs and building `GraphQL::Enum::EnumValue`s out of them

# File lib/graphql/schema/enum.rb, line 128
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
enum_values(context = GraphQL::Query::NullContext) click to toggle source

@return [Array<GraphQL::Schema::EnumValue>] Possible values of this enum

# File lib/graphql/schema/enum.rb, line 65
def enum_values(context = GraphQL::Query::NullContext)
  inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil
  visible_values = []
  warden = Warden.from_context(context)
  own_values.each do |key, values_entry|
    if (v = Warden.visible_entry?(:visible_enum_value?, values_entry, context, warden))
      visible_values << v
    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
inherited(child_class) click to toggle source
Calls superclass method
# File lib/graphql/schema/enum.rb, line 179
def inherited(child_class)
  child_class.const_set(:UnresolvedValueError, Class.new(Schema::Enum::UnresolvedValueError))
  super
end
kind() click to toggle source
# File lib/graphql/schema/enum.rb, line 138
def kind
  GraphQL::TypeKinds::ENUM
end
to_graphql() click to toggle source

@return [GraphQL::EnumType]

# File lib/graphql/schema/enum.rb, line 114
def to_graphql
  enum_type = GraphQL::EnumType.new
  enum_type.name = graphql_name
  enum_type.description = description
  enum_type.introspection = introspection
  enum_type.ast_node = ast_node
  values.each do |name, val|
    enum_type.add_value(val.deprecated_to_graphql)
  end
  enum_type.metadata[:type_class] = self
  enum_type
end
validate_non_null_input(value_name, ctx, max_errors: nil) click to toggle source
# File lib/graphql/schema/enum.rb, line 142
def validate_non_null_input(value_name, ctx, max_errors: nil)
  result = GraphQL::Query::InputValidationResult.new
  allowed_values = ctx.warden.enum_values(self)
  matching_value = allowed_values.find { |v| v.graphql_name == value_name }

  if matching_value.nil?
    result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:graphql_name).join(', ')}")
  end

  result
end
value(*args, **kwargs, &block) click to toggle source

Define a value for this enum @param graphql_name [String, Symbol] the GraphQL value for this, usually `SCREAMING_CASE` @param description [String], the GraphQL description for this value, present in documentation @param value [Object], the translated Ruby value for this object (defaults to `graphql_name`) @param deprecation_reason [String] if this object is deprecated, include a message here @return [void] @see {Schema::EnumValue} which handles these inputs by default

# File lib/graphql/schema/enum.rb, line 46
def value(*args, **kwargs, &block)
  kwargs[:owner] = self
  value = enum_value_class.new(*args, **kwargs, &block)
  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
values(context = GraphQL::Query::NullContext) click to toggle source

@return [Hash<String => GraphQL::Schema::EnumValue>] Possible values of this enum, keyed by name.

# File lib/graphql/schema/enum.rb, line 107
def values(context = GraphQL::Query::NullContext)
  enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val }
end

Private Class Methods

own_values() click to toggle source
# File lib/graphql/schema/enum.rb, line 186
def own_values
  @own_values ||= {}
end