class Fern::Parameters::Validator

Attributes

declared[RW]
errors[RW]

Public Class Methods

new(config) click to toggle source
# File lib/fern/parameters/validator.rb, line 13
def initialize(config)
  @config = config
  @errors = Errors.new
  @declared = {}
end

Public Instance Methods

validate(params) click to toggle source
# File lib/fern/parameters/validator.rb, line 19
def validate(params)
  @config.each do |name, config|
    if params.key?(name)
      @declared[name] = validate_constraints(
        name,
        params[name],
        config
      )
    else
      @declared[name] = config[:constraints][:default] if config[:constraints].key?(:default)
      if config[:constraints][:required] && @declared[name].nil?
        @errors.add(name, 'is required')
      end
    end
  end
end

Private Instance Methods

indefinite_articlerize(word) click to toggle source
# File lib/fern/parameters/validator.rb, line 136
def indefinite_articlerize(word)
  %w[a e i o u].include?(word[0].downcase) ? "an #{word}" : "a #{word}"
end
parse_type(val, type, array = false) click to toggle source
# File lib/fern/parameters/validator.rb, line 49
def parse_type(val, type, array = false)
  meth = "validate_#{type}"
  if array
    parsed = val.map { |el| send(meth, el) }
    return nil unless parsed.all? { |el| !el.nil? } && parsed
    parsed
  else
    send(meth, val)
  end
end
pluralize(word) click to toggle source
# File lib/fern/parameters/validator.rb, line 132
def pluralize(word)
  ActiveSupport::Inflector.pluralize(word)
end
validate_boolean(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 60
def validate_boolean(val)
  if val.casecmp('true').zero?
    true
  elsif val.casecmp('false').zero?
    false
  end
end
validate_constraints(name, raw_val, config) click to toggle source
# File lib/fern/parameters/validator.rb, line 38
def validate_constraints(name, raw_val, config)
  val = validate_type(name, raw_val, config[:type], config)

  return if val.nil?

  validate_numeric_constraints(name, val, config)
  validate_inclusion(name, val, config)

  val
end
validate_date(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 68
def validate_date(val)
  Date.parse(val)
rescue ArgumentError
end
validate_datetime(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 73
def validate_datetime(val)
  Time.parse(val)
rescue ArgumentError
end
validate_float(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 78
def validate_float(val)
  Float(val)
rescue ArgumentError
end
validate_inclusion(name, val, constraints) click to toggle source
# File lib/fern/parameters/validator.rb, line 83
def validate_inclusion(name, val, constraints)
  return unless constraints.key?(:values)
  return if constraints[:values].include?(val)
  @errors.add(name, "must be one of #{constraints[:values]}")
end
validate_integer(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 89
def validate_integer(val)
  Integer(val)
rescue ArgumentError
rescue TypeError
end
validate_max(name, val, max) click to toggle source
# File lib/fern/parameters/validator.rb, line 95
def validate_max(name, val, max)
  return unless val > max
  @errors.add(name, "must be less than or equal to #{max}")
end
validate_min(name, val, min) click to toggle source
# File lib/fern/parameters/validator.rb, line 100
def validate_min(name, val, min)
  return unless val < min
  @errors.add(name, "must be greater than or equal to #{min}")
end
validate_numeric(name, val) click to toggle source
# File lib/fern/parameters/validator.rb, line 105
def validate_numeric(name, val)
  validate_float(val) || @errors.add(name, 'must be a number')
end
validate_numeric_constraints(name, val, constraints) click to toggle source
# File lib/fern/parameters/validator.rb, line 109
def validate_numeric_constraints(name, val, constraints)
  return unless constraints.key?(:min) || constraints.key?(:max)
  validate_numeric(name, val)
  validate_min(name, val, constraints[:min]) if constraints.key?(:min)
  validate_max(name, val, constraints[:max]) if constraints.key?(:max)
end
validate_string(val) click to toggle source
# File lib/fern/parameters/validator.rb, line 116
def validate_string(val)
  val
end
validate_type(name, val, type, config) click to toggle source
# File lib/fern/parameters/validator.rb, line 120
def validate_type(name, val, type, config)
  parsed = parse_type(val, type, config[:constraints][:array])
  if parsed.nil?
    if config[:constraints][:array]
      @errors.add(name, "is not an array of #{pluralize(type)}")
    else
      @errors.add(name, "is not #{indefinite_articlerize(type)}")
    end
  end
  parsed
end