class Objecheck::Validator::Collector

Collector is used in Validator#validate to aggregate errors

Attributes

current_rule_name[R]
current_t[R]
prefix_stack[R]

Public Class Methods

new(validator, parent = nil) click to toggle source
# File lib/objecheck/validator/collector.rb, line 22
def initialize(validator, parent = nil)
  @validator = validator
  @current_validation_result = true
  @current_rule_name = parent ? parent.current_rule_name : nil
  @prefix_stack = parent ? [parent.prefix_stack.join('')] : []
  @errors = []
  @current_t = nil
end

Public Instance Methods

add_error(msg) click to toggle source
# File lib/objecheck/validator/collector.rb, line 38
def add_error(msg)
  @current_validation_result = false
  @errors << "#{@prefix_stack.join('')}: #{@current_rule_name}: #{msg}"
end
add_prefix_in(prefix) { || ... } click to toggle source
# File lib/objecheck/validator/collector.rb, line 31
def add_prefix_in(prefix)
  @prefix_stack.push(prefix)
  yield
ensure
  @prefix_stack.pop
end
commit(t) click to toggle source
# File lib/objecheck/validator/collector.rb, line 66
def commit(t)
  check_transaction(t)
  @current_t = nil
  @errors.concat(t.errors)
end
errors() click to toggle source
# File lib/objecheck/validator/collector.rb, line 56
def errors
  @errors.dup
end
rollback(t) click to toggle source
# File lib/objecheck/validator/collector.rb, line 72
def rollback(t)
  check_transaction(t)
  @current_t = nil
end
transaction() click to toggle source
# File lib/objecheck/validator/collector.rb, line 60
def transaction
  raise Objecheck::Error, 'another transaction is already created' if @current_t

  @current_t = self.class.new(@validator, self)
end
validate(target, rules) click to toggle source
# File lib/objecheck/validator/collector.rb, line 43
def validate(target, rules)
  prev_rule_name = @current_rule_name
  prev_validation_result = @current_validation_result
  rules.each do |name, rule|
    @current_rule_name = name
    rule.validate(target, self)
  end
  @current_validation_result
ensure
  @current_rule_name = prev_rule_name
  @current_validation_result = prev_validation_result
end

Private Instance Methods

check_transaction(t) click to toggle source
# File lib/objecheck/validator/collector.rb, line 79
def check_transaction(t)
  raise Objecheck::Error, 'transaction is not created' if !@current_t

  raise Objecheck::Error, "invalid transaction #{t} (current: #{@current_t})" if !t.equal?(@current_t)

  raise Objecheck::Error, "transaction hash uncommited nested transaction (#{t.current_t})" if t.current_t
end