Class: Grape::Validations::Types::MultipleTypeCoercer

Inherits:
Object
  • Object
show all
Defined in:
lib/grape/validations/types/multiple_type_coercer.rb

Overview

This class is intended for use with Grape endpoint parameters that have been declared to be of variant-type using the :types option. MultipleTypeCoercer will build a coercer for each type declared in the array passed to :types using build_coercer. It will apply these coercers to parameter values in the order given to :types, and will return the value returned by the first coercer to successfully coerce the parameter value. Therefore if String is an allowed type it should be declared last, since it will always successfully “coerce” the value.

Instance Method Summary collapse

Constructor Details

#initialize(types, method = nil) ⇒ MultipleTypeCoercer

Construct a new coercer that will attempt to coerce values to the given list of types in the given order.



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/grape/validations/types/multiple_type_coercer.rb', line 20

def initialize(types, method = nil)
  @method = method.respond_to?(:parse) ? method.method(:parse) : method

  @type_coercers = types.map do |type|
    if Types.multiple? type
      VariantCollectionCoercer.new type
    else
      Types.build_coercer type
    end
  end
end

Instance Method Details

#call(value) ⇒ Object, InvalidValue

This method is called from somewhere within Virtus::Attribute::coerce in order to coerce the given value.



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/grape/validations/types/multiple_type_coercer.rb', line 40

def call(value)
  return @method.call(value) if @method

  @type_coercers.each do |coercer|
    coerced = coercer.coerce(value)

    return coerced if coercer.value_coerced? coerced
  end

  # Declare that we couldn't coerce the value in such a way
  # that Grape won't ask us again if the value is valid
  InvalidValue.new
end

#success?(_primitive, value) ⇒ true, false

This method is called from somewhere within Virtus::Attribute::value_coerced? in order to assert that the value has been coerced successfully. Due to Grape’s design this will in fact only be called if a custom coercion method is being used, since #call returns an InvalidValue object if the value could not be coerced.



70
71
72
# File 'lib/grape/validations/types/multiple_type_coercer.rb', line 70

def success?(_primitive, value)
  @type_coercers.any? { |coercer| coercer.value_coerced? value }
end