Sha256: b3ee8d490da0514e20f96dd7136659d0f6a0c0f11d51ee34a489a51a826b7ef7

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

module GraphQL
  class Query
    class SerialExecution
      class FieldResolution < GraphQL::Query::BaseExecution::SelectedObjectResolution
        attr_reader :field, :arguments

        def initialize(ast_node, parent_type, target, query, execution_strategy)
          super
          @field = query.schema.get_field(parent_type, ast_node.name) || raise("No field found on #{parent_type.name} '#{parent_type}' for '#{ast_node.name}'")
          @arguments = GraphQL::Query::Arguments.new(ast_node.arguments, field.arguments, query.variables)
        end

        def result
          result_name = ast_node.alias || ast_node.name
          { result_name => result_value}
        end

        private

        def result_value
          value = field.resolve(target, arguments, query.context)

          if value == GraphQL::Query::DEFAULT_RESOLVE
            begin
              value = target.public_send(ast_node.name)
            rescue NoMethodError => err
              raise("Couldn't resolve field '#{ast_node.name}' to #{target.class} '#{target}' (resulted in #{err})")
            end
          end

          return nil if value.nil?


          resolved_type = field.type.kind.resolve(field.type, value)
          strategy_class = GraphQL::Query::ValueResolution.get_strategy_for_kind(resolved_type.kind)
          result_strategy = strategy_class.new(value, resolved_type, target, parent_type, ast_node, query, execution_strategy)
          result_strategy.result
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
graphql-0.7.1 lib/graphql/query/serial_execution/field_resolution.rb
graphql-0.7.0 lib/graphql/query/serial_execution/field_resolution.rb