class Rulz::Evaluator::Rule
Public Class Methods
new(receiver, proc)
click to toggle source
# File lib/rulz/evaluator.rb, line 82 def initialize(receiver, proc) @receiver = receiver @proc = proc end
Public Instance Methods
evaluate()
click to toggle source
# File lib/rulz/evaluator.rb, line 87 def evaluate instance_eval(&@proc) end
where(condition, *args, &block)
click to toggle source
# File lib/rulz/evaluator.rb, line 91 def where(condition, *args, &block) if condition.is_a? String @receiver.instance_eval(&block) if Rulz::Evaluator::Condition.new(@receiver, condition, *args).evaluate elsif condition.is_a? Proc @receiver.instance_eval(&block) if condition.call(*args) elsif condition.is_a? Array split_condition = condition.inject([[]]) do |results, element| if ["AND", "OR"].include? element results << {"AND" => "&&", "OR" => "||"}[element] results << [] elsif element.is_a?(Hash) results.pop if results.last.respond_to?(:empty?) && results.last.empty? results << element else results.last << element end results end split_condition.map! do |element| if element.is_a?(Array) Rulz::Evaluator::Condition.new(@receiver, *element).evaluate elsif element.is_a?(Hash) attribute, element = *element.first Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *element).evaluate else element end end @receiver.instance_eval(&block) if eval(split_condition.join(" ")) elsif condition.is_a? Hash attribute, condition = *condition.first @receiver.instance_eval(&block) if Rulz::Evaluator::AttributeCondition.new(@receiver, attribute, *condition).evaluate else raise ArgumentError, "Invalid condition" end end