Class: Grape::Validations::Types::VariantCollectionCoercer

Inherits:
Virtus::Attribute
  • Object
show all
Defined in:
lib/grape/validations/types/variant_collection_coercer.rb

Overview

This class wraps MultipleTypeCoercer, for use with collections that allow members of more than one type.

Instance Method Summary collapse

Constructor Details

#initialize(types, method = nil) ⇒ VariantCollectionCoercer

Construct a new coercer that will attempt to coerce a list of values such that all members are of one of the given types. The container may also optionally be coerced to a +Set+. An arbitrary coercion +method+ may be supplied, which will be passed the entire collection as a parameter and should return a new collection, or may return the same one if no coercion was required.


18
19
20
21
22
23
24
25
# File 'lib/grape/validations/types/variant_collection_coercer.rb', line 18

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

  # If we have a coercion method, pass it in here to save
  # building another one, even though we call it directly.
  @member_coercer = MultipleTypeCoercer.new types, method
end

Instance Method Details

#coerce(value) ⇒ Array<Object>, ...

Coerce the given value.


33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/grape/validations/types/variant_collection_coercer.rb', line 33

def coerce(value)
  return InvalidValue.new unless value.is_a? Array

  value =
    if @method
      @method.call(value)
    else
      value.map { |v| @member_coercer.call(v) }
    end
  return Set.new value if @types.is_a? Set

  value
end

#value_coerced?(value) ⇒ true, false

Assert that the value has been coerced successfully.


52
53
54
55
# File 'lib/grape/validations/types/variant_collection_coercer.rb', line 52

def value_coerced?(value)
  value.is_a?(@types.class) &&
    value.all? { |v| @member_coercer.success?(@types, v) }
end