class PoroValidator::Validators::NumericValidator

Constants

FLOAT_MATCHER
INTEGER_MATCHER
VALID_OPTIONS
VALID_OPTION_VALUES

Public Instance Methods

validate(attribute, value, options) click to toggle source
# File lib/poro_validator/validators/numeric_validator.rb, line 15
def validate(attribute, value, options)
  return if value.nil?

  unless is_numeric?(value.to_s, INTEGER_MATCHER) ||
      is_numeric?(value.to_s, FLOAT_MATCHER)
    errors.add(attribute, :integer_or_float)
    return
  end

  message = options[:message] || :numeric

  validate_numeric_options(options.keys)

  options.each do |k, v|
    unless VALID_OPTION_VALUES.include?(v.class)
      raise ::PoroValidator::InvalidValidator.new(
        "Invalid option: #{k} => #{v}"
      )
    end

    unless matchers(k).call(value, v)
      errors.add(attribute, message, k => v)
    end
  end
end

Private Instance Methods

is_numeric?(v, regex_match) click to toggle source
# File lib/poro_validator/validators/numeric_validator.rb, line 75
def is_numeric?(v, regex_match)
  v =~ regex_match
end
matchers(key) click to toggle source
# File lib/poro_validator/validators/numeric_validator.rb, line 55
def matchers(key)
  {
    extremum: proc do |value, length|
      value == length
    end,

    max: proc do |value, length|
      value <= length
    end,

    min: proc do |value, length|
      value >= length
    end,

    in: proc do |value, length|
      length.cover?(value)
    end
  }[key] || nil
end
validate_numeric_options(options_keys) click to toggle source
# File lib/poro_validator/validators/numeric_validator.rb, line 43
def validate_numeric_options(options_keys)
  opts = options_keys - VALID_OPTIONS

  return if opts.length <= 0

  unless VALID_OPTIONS.include?(opts)
    raise ::PoroValidator::InvalidValidator.new(
      "Invalid options: #{opts.inspect} passed for numeric validator."
    )
  end
end