class Validate::Constraints::ValidationContext

Attributes

value[R]
violations[R]

Public Class Methods

key(key, violations = []) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 14
def self.key(key, violations = [])
  new(key, Path.new([KeyPath.new(key)]), violations)
end
new(value, path = Path.new, violations = []) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 21
def initialize(value, path = Path.new, violations = [])
  @value      = value
  @path       = path
  @violations = violations
  @keys = Hash.new do |hash, key|
    unless @value.respond_to?(:[]) || @value.respond_to_missing?(:[])
      raise Error::KeyError,
            "#{key.inspect}: value doesn't respond to :[]"
    end
    begin
      hash[key] = child_context(@value[key], KeyPath.new(key))
    rescue => e
      raise Error::KeyError,
            "#{key.inspect}: #{e.message}",
            cause: e
    end
  end
  @attrs = Hash.new do |hash, attr|
    unless @value.respond_to?(attr) || @value.respond_to_missing?(attr)
      raise Error::NameError,
            "#{attr.inspect}: value doesn't respond to #{attr.inspect}"
    end
    hash[attr] = child_context(@value.send(attr), AttrPath.new(attr))
  end
end
none() click to toggle source
# File lib/validate/constraints/validation_context.rb, line 6
def self.none
  @none ||= None.new
end
root(value, violations = []) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 10
def self.root(value, violations = [])
  new(value, Path.new, violations)
end

Public Instance Methods

[](key) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 47
def [](key)
  @keys[key]
end
add_violation(constraint) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 55
def add_violation(constraint)
  @violations << create_violation(constraint)
  self
end
attr(name) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 51
def attr(name)
  @attrs[name]
end
clear_violations() click to toggle source
# File lib/validate/constraints/validation_context.rb, line 60
def clear_violations
  @violations.clear
  self
end
has_violations?() click to toggle source
# File lib/validate/constraints/validation_context.rb, line 65
def has_violations?
  !@violations.empty?
end
merge(other) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 75
def merge(other)
  other.violations.each do |violation|
    @violations << Constraint::Violation.new(violation.value, @path.child(violation.path), violation.constraint)
  end
  self
end
to_err(backtrace = []) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 69
def to_err(backtrace = [])
  err = Error::ConstraintViolationError.new(@violations.freeze)
  err.set_backtrace(backtrace)
  err
end

Private Instance Methods

child_context(value, path) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 88
def child_context(value, path)
  ValidationContext.new(value, @path.child(path), @violations)
end
create_violation(constraint) click to toggle source
# File lib/validate/constraints/validation_context.rb, line 84
def create_violation(constraint)
  Constraint::Violation.new(@value, @path, constraint)
end