Class: GraphQL::Schema::BuildFromDefinition::ResolveMap::DefaultResolve Private

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Instance Method Summary collapse

Constructor Details

#initialize(field_map, field_name) ⇒ DefaultResolve

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of DefaultResolve.


7
8
9
10
# File 'lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb', line 7

def initialize(field_map, field_name)
  @field_map = field_map
  @field_name = field_name
end

Instance Method Details

#call(obj, args, ctx) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Make some runtime checks about how `obj` implements the `field_name`.

Create a new resolve function according to that implementation, then:

- update `field_map` with this implementation
- call the implementation now (to satisfy this field execution)

If `obj` doesn't implement `field_name`, raise an error.


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb', line 20

def call(obj, args, ctx)
  method_name = @field_name
  if !obj.respond_to?(method_name)
    raise KeyError, "Can't resolve field #{method_name} on #{obj}"
  else
    method_arity = obj.method(method_name).arity
    resolver = case method_arity
    when 0, -1      # -1 Handles method_missing, eg openstruct

      ->(o, a, c) { o.public_send(method_name) }
    when 1
      ->(o, a, c) { o.public_send(method_name, a) }
    when 2
      ->(o, a, c) { o.public_send(method_name, a, c) }
    else
      raise "Unexpected resolve arity: #{method_arity}. Must be 0, 1, 2"
    end    # Call the resolver directly next time

    @field_map[method_name] = resolver    # Call through this time

    resolver.call(obj, args, ctx)
  end
end