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