Class: Objecheck::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/objecheck/validator.rb

Overview

Validator checks a object with given schema and report errors

Defined Under Namespace

Classes: AnyRule, Collector, EachKeyRule, EachRule, EachValueRule, EqRule, KeyValueRule, RespondToRule, SatisfyRule, TypeRule

Constant Summary collapse

DEFAULT_RULES =
{
  type: TypeRule,
  each: EachRule,
  each_key: EachKeyRule,
  each_value: EachValueRule,
  key_value: KeyValueRule,
  eq: EqRule,
  any: AnyRule,
  satisfy: SatisfyRule,
  respond_to: RespondToRule
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(schema, rule_map = DEFAULT_RULES, schema_validation = true) ⇒ Validator

Returns a new instance of Validator.



41
42
43
44
45
46
# File 'lib/objecheck/validator.rb', line 41

def initialize(schema, rule_map = DEFAULT_RULES, schema_validation = true)
  @rule_map = rule_map
  @schema_validation = schema_validation
  @param_validators = {} if schema_validation
  @rules = compile_schema(schema)
end

Instance Method Details

#compile_schema(schema) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/objecheck/validator.rb', line 56

def compile_schema(schema)
  schema.each_with_object({}) do |(rule_name, param), rules|
    rule_class = @rule_map[rule_name]
    if @schema_validation && rule_class.respond_to?(:schema)
      param_validator = @param_validators[rule_name]
      if !param_validator
        param_schema, param_rule_map = rule_class.schema
        param_validator = Objecheck::Validator.new(param_schema, param_rule_map || DEFAULT_RULES, false)
        @param_validators[:rule_name] = param_validator
      end
      if !(errors = param_validator.validate(param)).empty?
        raise Objecheck::Error, "paramters for #{rule_name} rule is invalid\n  #{errors.join("\n  ")}"
      end
    end
    rules[rule_name] = rule_class.new(self, param)
  end
end

#validate(target) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/objecheck/validator.rb', line 48

def validate(target)
  collector = Collector.new(self)
  collector.add_prefix_in('root') do
    collector.validate(target, @rules)
  end
  collector.errors
end