Sha256: 63add03ef5a2b245262c5be5ecbc170b97c584d58230529625271336c8c7dd09
Contents?: true
Size: 1.53 KB
Versions: 3
Compression:
Stored size: 1.53 KB
Contents
# frozen_string_literal: true require_relative 'dry_type_coercer' module Grape module Validations module Types # Coerces elements in an array. It might be an array of strings or integers or # anything else. # # It could've been possible to use an +of+ # method (https://dry-rb.org/gems/dry-types/1.2/array-with-member/) # provided by dry-types. Unfortunately, it doesn't work for Grape because of # behavior of Virtus which was used earlier, a `Grape::Validations::Types::PrimitiveCoercer` # maintains Virtus behavior in coercing. class ArrayCoercer < DryTypeCoercer def initialize(type, strict = false) super @coercer = scope::Array @elem_coercer = PrimitiveCoercer.new(type.first, strict) end def call(_val) collection = super return collection if collection.is_a?(InvalidValue) coerce_elements collection end protected def coerce_elements(collection) collection.each_with_index do |elem, index| return InvalidValue.new if reject?(elem) coerced_elem = @elem_coercer.call(elem) return coerced_elem if coerced_elem.is_a?(InvalidValue) collection[index] = coerced_elem end collection end # This method maintaine logic which was defined by Virtus for arrays. # Virtus doesn't allow nil in arrays. def reject?(val) val.nil? end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
grape-1.3.2 | lib/grape/validations/types/array_coercer.rb |
grape-1.3.1 | lib/grape/validations/types/array_coercer.rb |
grape-1.3.0 | lib/grape/validations/types/array_coercer.rb |