class GraphQL::Schema::BuildFromDefinition::ResolveMap

Wrap a user-provided hash of resolution behavior for easy access at runtime.

Coerce scalar values by:

Interface/union resolution can be provided as a ‘resolve_type:` key.

@api private

Public Class Methods

new(user_resolve_hash) click to toggle source
# File lib/graphql/schema/build_from_definition/resolve_map.rb, line 23
def initialize(user_resolve_hash)
  @resolve_hash = Hash.new do |h, k|
    # For each type name, provide a new hash if one wasn't given:
    h[k] = Hash.new do |h2, k2|
      if k2 == "coerce_input" || k2 == "coerce_result"
        # This isn't an object field, it's a scalar coerce function.
        # Use a passthrough
        NullScalarCoerce
      else
        # For each field, provide a resolver that will
        # make runtime checks & replace itself
        h2[k2] = DefaultResolve.new(h2, k2)
      end
    end
  end
  @user_resolve_hash = user_resolve_hash
  # User-provided resolve functions take priority over the default:
  @user_resolve_hash.each do |type_name, fields|
    type_name_s = type_name.to_s
    case fields
    when Hash
      fields.each do |field_name, resolve_fn|
        @resolve_hash[type_name_s][field_name.to_s] = resolve_fn
      end
    when Proc
      # for example, "resolve_type"
      @resolve_hash[type_name_s] = fields
    else
      raise ArgumentError, "Unexpected resolve hash value for #{type_name.inspect}: #{fields.inspect} (#{fields.class})"
    end
  end

  # Check the normalized hash, not the user input:
  if @resolve_hash.key?("resolve_type")
    define_singleton_method :resolve_type do |type, obj, ctx|
      @resolve_hash.fetch("resolve_type").call(type, obj, ctx)
    end
  end
end

Public Instance Methods

call(type, field, obj, args, ctx) click to toggle source
# File lib/graphql/schema/build_from_definition/resolve_map.rb, line 63
def call(type, field, obj, args, ctx)
  resolver = @resolve_hash[type.graphql_name][field.graphql_name]
  resolver.call(obj, args, ctx)
end
coerce_input(type, value, ctx) click to toggle source
# File lib/graphql/schema/build_from_definition/resolve_map.rb, line 68
def coerce_input(type, value, ctx)
  @resolve_hash[type.graphql_name]["coerce_input"].call(value, ctx)
end
coerce_result(type, value, ctx) click to toggle source
# File lib/graphql/schema/build_from_definition/resolve_map.rb, line 72
def coerce_result(type, value, ctx)
  @resolve_hash[type.graphql_name]["coerce_result"].call(value, ctx)
end