Sha256: 9b1b13d3c4bc6bc7cd0de3cef0bf2487daff150424c9d21ad69d8d43552fcbad

Contents?: true

Size: 1.97 KB

Versions: 3

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true
module GraphQL
  class Schema
    class InputObject < GraphQL::Schema::Member
      extend GraphQL::Delegate

      def initialize(values, context:, defaults_used:)
        @arguments = self.class.arguments_class.new(values, context: context, defaults_used: defaults_used)
        @context = context
      end

      # A lot of methods work just like GraphQL::Arguments
      def_delegators :@arguments, :[], :key?, :to_h
      def_delegators :to_h, :keys, :values, :each, :any?

      class << self
        # @return [Class<GraphQL::Arguments>]
        attr_accessor :arguments_class

        def argument(*args)
          argument = GraphQL::Schema::Argument.new(*args)
          arg_name = argument.graphql_definition.name
          own_arguments[arg_name] = argument
          # Add a method access
          define_method(Member::BuildType.underscore(arg_name)) do
            @arguments.public_send(arg_name)
          end
        end

        # @return [Hash<String => GraphQL::Schema::Argument] Input fields on this input object, keyed by name.
        def arguments
          inherited_arguments = (superclass <= GraphQL::Schema::InputObject ? superclass.arguments : {})
          # Local definitions override inherited ones
          inherited_arguments.merge(own_arguments)
        end

        def own_arguments
          @own_arguments ||= {}
        end

        def to_graphql
          type_defn = GraphQL::InputObjectType.new
          type_defn.name = graphql_name
          type_defn.description = description
          arguments.each do |name, arg|
            type_defn.arguments[arg.graphql_definition.name] = arg.graphql_definition
          end
          # Make a reference to a classic-style Arguments class
          self.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(type_defn)
          # But use this InputObject class at runtime
          type_defn.arguments_class = self
          type_defn
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
graphql-1.8.0.pre6 lib/graphql/schema/input_object.rb
graphql-1.8.0.pre5 lib/graphql/schema/input_object.rb
graphql-1.8.0.pre4 lib/graphql/schema/input_object.rb