class Objecheck::Validator::KeyValueRule

KeyValueRule validates key/value in the target by using each_pair

Public Class Methods

new(validator, key_value_schema) click to toggle source
# File lib/objecheck/validator/key_value_rule.rb, line 20
def initialize(validator, key_value_schema)
  @key_value_rules = key_value_schema.each_with_object({}) do |(key, schema), rules|
    rules[key] = {
      required: schema.fetch(:required, true),
      rule: validator.compile_schema(schema[:value])
    }
  end
end
schema() click to toggle source
# File lib/objecheck/validator/key_value_rule.rb, line 46
def self.schema
  [
    {
      type: Hash,
      each_value: {
        type: Hash,
        key_value: {
          required: { required: false, value: { type: :bool } },
          value: { value: { type: Hash } }
        }
      }
    }
  ]
end

Public Instance Methods

validate(target, collector) click to toggle source
# File lib/objecheck/validator/key_value_rule.rb, line 29
def validate(target, collector)
  if !target.respond_to?(:each_pair)
    collector.add_error('should respond to `each_pair`')
    return
  end

  @key_value_rules.each_pair do |key, rule|
    if target.key?(key)
      collector.add_prefix_in("[#{key.inspect}]") do
        collector.validate(target[key], rule[:rule])
      end
    elsif rule[:required]
      collector.add_error("should contain key #{key.inspect}")
    end
  end
end