Sha256: 6d4eeabf70d9419283fda6b18716757c5d13f328b18f0e038fb7afd786faf6f1

Contents?: true

Size: 1.65 KB

Versions: 186

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.inspect}"
            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

186 entries across 186 versions & 2 rubygems

Version Path
graphql-1.11.12 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.14 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.3.22 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.1.15 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.11.11 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.12.25 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-1.13.24 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.0.32 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.1.14 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.2.17 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.3.21 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.13 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.12 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.11 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.10 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.9 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.8 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.7 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.6 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb
graphql-2.4.5 lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb