Sha256: 9ebfcfa79cc4d95f7fe8d8ede56ab883e84ea08ef800cdad01647f01f15f7799

Contents?: true

Size: 1.65 KB

Versions: 80

Compression:

Stored size: 1.65 KB

Contents

# frozen_string_literal: true
module GraphQL
  class Schema
    module BuildFromDefinition
      class ResolveMap
        class DefaultResolve
          def initialize(field_map, field_name)
            @field_map = field_map
            @field_name = field_name
          end

          # 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.
          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
        end
      end
    end
  end
end

Version data entries

80 entries across 80 versions & 1 rubygems

Version Path
graphql-1.8.18 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.21 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.20 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.19 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.18 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.17 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.16 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.15 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.14 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.13 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.12 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.11 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.10 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.9 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.8 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.7 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.6 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.5 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.4 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.9.3 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb