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.

Parameters:

  • types (Array<Class>)

    list of allowed types

  • method (#call, #parse) (defaults to: nil)

    method by which values should be coerced. See class docs for default behaviour.



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

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, @method
    else
      Types.build_coercer type, strict: !@method.nil?
    end
  end
end

Instance Method Details

#call(val) ⇒ Object, InvalidValue

Coerces the given value.

Parameters:

  • val (String)

    value to be coerced, in grape this should always be a string.

Returns:



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

def call(val)
  # once the value is coerced by the custom method, its type should be checked
  val = @method.call(val) if @method

  coerced_val = InvalidValue.new

  @type_coercers.each do |coercer|
    coerced_val = coercer.call(val)

    return coerced_val unless coerced_val.is_a?(InvalidValue)
  end

  coerced_val
end