lib/graphql/schema/argument.rb in graphql-1.8.0.pre10 vs lib/graphql/schema/argument.rb in graphql-1.8.0.pre11

- old
+ new

@@ -5,30 +5,41 @@ include GraphQL::Schema::Member::CachedGraphQLDefinition include GraphQL::Schema::Member::AcceptsDefinition NO_DEFAULT = :__no_default__ + # @return [String] the GraphQL name for this argument, camelized unless `camelize: false` is provided attr_reader :name # @return [GraphQL::Schema::Field, Class] The field or input object this argument belongs to attr_reader :owner + # @return [Symbol] A method to call to transform this value before sending it to field resolution method + attr_reader :prepare + + # @return [Symbol] This argument's name in Ruby keyword arguments + attr_reader :keyword + # @param arg_name [Symbol] # @param type_expr # @param desc [String] # @param required [Boolean] if true, this argument is non-null; if false, this argument is nullable # @param description [String] # @param default_value [Object] + # @param as [Symbol] Override the keyword name when passed to a method + # @param prepare [Symbol] A method to call to tranform this argument's valuebefore sending it to field resolution # @param camelize [Boolean] if true, the name will be camelized when building the schema - def initialize(arg_name, type_expr, desc = nil, required:, description: nil, default_value: NO_DEFAULT, camelize: true, owner:, &definition_block) - @name = arg_name.to_s + def initialize(arg_name, type_expr, desc = nil, required:, description: nil, default_value: NO_DEFAULT, as: nil, camelize: true, prepare: nil, owner:, &definition_block) + @name = camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s @type_expr = type_expr @description = desc || description @null = !required @default_value = default_value - @camelize = camelize @owner = owner + @as = as + @keyword = as || Schema::Member::BuildType.underscore(@name).to_sym + @prepare = prepare if definition_block instance_eval(&definition_block) end end @@ -41,19 +52,40 @@ end end def to_graphql argument = GraphQL::Argument.new - argument.name = @camelize ? Member::BuildType.camelize(@name) : @name - argument.type = -> { - Member::BuildType.parse_type(@type_expr, null: @null) - } + argument.name = @name + argument.type = -> { type } argument.description = @description argument.metadata[:type_class] = self + argument.as = @as if NO_DEFAULT != @default_value argument.default_value = @default_value end argument + end + + def type + @type ||= Member::BuildType.parse_type(@type_expr, null: @null) + rescue StandardError => err + raise ArgumentError, "Couldn't build type for Argument #{@owner.name}.#{name}: #{err.class.name}: #{err.message}", err.backtrace + end + + # Apply the {prepare} configuration to `value`, using methods from `obj`. + # Used by the runtime. + # @api private + def prepare_value(obj, value) + case @prepare + when nil + value + when Symbol, String + obj.public_send(@prepare, value) + when Proc + @prepare.call(value, obj.context) + else + raise "Invalid prepare for #{@owner.name}.name: #{@prepare.inspect}" + end end end end end