module Rulezilla::DSL::ClassMethods

Public Instance Methods

all(record = {}) click to toggle source
# File lib/rulezilla/dsl.rb, line 57
def all(record = {})
  validate_missing_attributes(record)
  result_node = tree.find_all(record_klass_instance(record))

  result_node&.map { |node| node.result(record_klass_instance(record)) }
end
apply(record = {}) click to toggle source
# File lib/rulezilla/dsl.rb, line 51
def apply(record = {})
  result_node = trace(record).last

  result_node&.result(record_klass_instance(record))
end
include_rule(rule) click to toggle source
# File lib/rulezilla/dsl.rb, line 74
def include_rule(rule)
  if rule.ancestors.include?(Rulezilla::DSL)
    tree.clone_and_append_children(rule.tree.root_node.children)
  else
    raise "#{rule.name} is not a Rulezilla class"
  end
end
mandatory_attributes() click to toggle source
# File lib/rulezilla/dsl.rb, line 47
def mandatory_attributes
  @mandatory_attributes ||= []
end
results(record = nil) click to toggle source
# File lib/rulezilla/dsl.rb, line 64
def results(record = nil)
  tree.all_results(record_klass_instance(record)).uniq
end
trace(record = nil) click to toggle source
# File lib/rulezilla/dsl.rb, line 68
def trace(record = nil)
  validate_missing_attributes(record)

  tree.trace(record_klass_instance(record))
end
tree() click to toggle source
# File lib/rulezilla/dsl.rb, line 82
def tree
  @tree ||= Tree.new(Node.new)
end

Private Instance Methods

condition(&block) click to toggle source
# File lib/rulezilla/dsl.rb, line 121
def condition(&block)
  tree.current_node.condition = block
end
default(value = nil, &block)
Alias for: result
define(name = nil, &block) click to toggle source
# File lib/rulezilla/dsl.rb, line 113
def define(name = nil, &block)
  tree.create_and_move_to_child(name)

  instance_eval(&block)
  tree.go_up
end
Also aliased as: group
group(name = nil, &block)
Alias for: define
missing_attributes(record) click to toggle source
# File lib/rulezilla/dsl.rb, line 92
def missing_attributes(record)
  record_attributes = if record.is_a?(Hash) || record.is_a?(OpenStruct)
                        record.to_h.keys.map(&:to_sym)
                      else
                        record.methods
                      end

  mandatory_attributes.map(&:to_sym) - record_attributes
end
record_klass_instance(record) click to toggle source
# File lib/rulezilla/dsl.rb, line 88
def record_klass_instance(record)
  Object.const_get("#{name}Record").new(record)
end
result(value = nil, &block) click to toggle source
# File lib/rulezilla/dsl.rb, line 125
def result(value = nil, &block)
  tree.current_node.result = value.nil? ? block : value
end
Also aliased as: default
validate_attributes_presence(*fields) click to toggle source

DSL methods

# File lib/rulezilla/dsl.rb, line 109
def validate_attributes_presence(*fields)
  @mandatory_attributes = mandatory_attributes | fields
end
validate_missing_attributes(record) click to toggle source
# File lib/rulezilla/dsl.rb, line 102
def validate_missing_attributes(record)
  unless missing_attributes(record).empty?
    raise "Missing #{missing_attributes(record).join(', ')} attributes from: #{record}"
  end
end