class Grape::Validations::CoerceValidator

Attributes

converter[R]

@!attribute [r] converter Object that will be used for parameter coercion and type checking.

See {Types.build_coercer}

@return [Virtus::Attribute]

Public Class Methods

new(*_args) click to toggle source
Calls superclass method Grape::Validations::Base.new
# File lib/grape/validations/validators/coerce.rb, line 8
def initialize(*_args)
  super
  @converter = Types.build_coercer(type, @option[:method])
end

Public Instance Methods

validate_param!(attr_name, params) click to toggle source
# File lib/grape/validations/validators/coerce.rb, line 13
def validate_param!(attr_name, params)
  fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce) unless params.is_a? Hash
  new_value = coerce_value(params[attr_name])
  if valid_type?(new_value)
    params[attr_name] = new_value
  else
    fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:coerce)
  end
end

Private Instance Methods

coerce_value(val) click to toggle source
# File lib/grape/validations/validators/coerce.rb, line 43
def coerce_value(val)
  # Don't coerce things other than nil to Arrays or Hashes
  unless (@option[:method] && !val.nil?) || type.is_a?(Virtus::Attribute)
    return val || []      if type == Array
    return val || Set.new if type == Set
    return val || {}      if type == Hash
  end

  converter.coerce(val)

# not the prettiest but some invalid coercion can currently trigger
# errors in Virtus (see coerce_spec.rb:75)
rescue
  Types::InvalidValue.new
end
type() click to toggle source

Type to which the parameter will be coerced.

@return [Class]

# File lib/grape/validations/validators/coerce.rb, line 62
def type
  @option[:type].is_a?(Hash) ? @option[:type][:value] : @option[:type]
end
valid_type?(val) click to toggle source
# File lib/grape/validations/validators/coerce.rb, line 33
def valid_type?(val)
  # Special value to denote coercion failure
  return false if val.instance_of?(Types::InvalidValue)

  # Allow nil, to ignore when a parameter is absent
  return true if val.nil?

  converter.value_coerced? val
end