Class: Rulz::Evaluator::Rule

Inherits:
Base
  • Object
show all
Defined in:
lib/rulz/evaluator.rb

Instance Method Summary collapse

Methods inherited from Base

#it

Constructor Details

#initialize(receiver, proc) ⇒ Rule



82
83
84
85
# File 'lib/rulz/evaluator.rb', line 82

def initialize(receiver, proc)
  @receiver = receiver
  @proc = proc
end

Instance Method Details

#evaluateObject



87
88
89
# File 'lib/rulz/evaluator.rb', line 87

def evaluate
  instance_eval(&@proc)
end

#where(condition, *args, &block) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 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