class PoroValidator::Validator::Conditions

Public Class Methods

matched?(conditions, context) click to toggle source
# File lib/poro_validator/validator/conditions.rb, line 4
def self.matched?(conditions, context)
  results = []
  inst    = new(context)

  conditions.each do |condition|
    condition.each do |type, value|
      unless [:if, :unless].include?(type)
        raise ::PoroValidator::InvalidCondition.new(
          "Unimplemented conditional key: #{type}"
        )
      end

      if value.is_a?(::Array)
        value.each do |v|
          results << inst.match_condition(type, v)
        end
        next
      end

      results << inst.match_condition(type, value)
      next
    end
  end

  return false if results.include?(false)
  true
end
new(context) click to toggle source
# File lib/poro_validator/validator/conditions.rb, line 32
def initialize(context)
  @context = context
end

Public Instance Methods

match_condition(type, condition) click to toggle source
# File lib/poro_validator/validator/conditions.rb, line 36
def match_condition(type, condition)
  result =
    case condition
    when String
      condition_type[String].call(context, condition)
    when Symbol
      condition_type[Symbol].call(context, condition)
    when Proc
      condition.call(context)
    else
      raise ::PoroValidator::InvalidCondition.new(
        "Unimplemented condition: #{condition.inspect}"
      )
    end

  if type == :unless
    return !result
  end
  result
end

Private Instance Methods

condition_type() click to toggle source
# File lib/poro_validator/validator/conditions.rb, line 63
def condition_type
  {
    String => lambda { |context, string| context.entity.instance_eval(string) },
    Symbol => lambda { |context, method| context.send(method, context.entity) },
  }
end
context() click to toggle source
# File lib/poro_validator/validator/conditions.rb, line 59
def context
  @context
end