Class: Dry::Logic::RuleCompiler

Inherits:
Object
  • Object
show all
Includes:
Core::Constants
Defined in:
lib/dry/logic/rule_compiler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(predicates) ⇒ RuleCompiler

Returns a new instance of RuleCompiler.



15
16
17
# File 'lib/dry/logic/rule_compiler.rb', line 15

def initialize(predicates)
  @predicates = predicates
end

Instance Attribute Details

#predicatesObject (readonly)

Returns the value of attribute predicates.



13
14
15
# File 'lib/dry/logic/rule_compiler.rb', line 13

def predicates
  @predicates
end

Instance Method Details

#call(ast) ⇒ Object



19
20
21
# File 'lib/dry/logic/rule_compiler.rb', line 19

def call(ast)
  ast.map { |node| visit(node) }
end

#visit(node) ⇒ Object



23
24
25
26
# File 'lib/dry/logic/rule_compiler.rb', line 23

def visit(node)
  name, nodes = node
  send(:"visit_#{name}", nodes)
end

#visit_and(node) ⇒ Object



67
68
69
70
# File 'lib/dry/logic/rule_compiler.rb', line 67

def visit_and(node)
  left, right = node
  visit(left).and(visit(right))
end

#visit_attr(node) ⇒ Object



42
43
44
45
# File 'lib/dry/logic/rule_compiler.rb', line 42

def visit_attr(node)
  name, predicate = node
  Operations::Attr.new(visit(predicate), name: name)
end

#visit_check(node) ⇒ Object



28
29
30
31
# File 'lib/dry/logic/rule_compiler.rb', line 28

def visit_check(node)
  keys, predicate = node
  Operations::Check.new(visit(predicate), keys: keys)
end

#visit_each(node) ⇒ Object



51
52
53
# File 'lib/dry/logic/rule_compiler.rb', line 51

def visit_each(node)
  Operations::Each.new(visit(node))
end

#visit_implication(node) ⇒ Object



82
83
84
85
# File 'lib/dry/logic/rule_compiler.rb', line 82

def visit_implication(node)
  left, right = node
  visit(left).then(visit(right))
end

#visit_key(node) ⇒ Object



37
38
39
40
# File 'lib/dry/logic/rule_compiler.rb', line 37

def visit_key(node)
  name, predicate = node
  Operations::Key.new(visit(predicate), name: name)
end

#visit_not(node) ⇒ Object



33
34
35
# File 'lib/dry/logic/rule_compiler.rb', line 33

def visit_not(node)
  Operations::Negation.new(visit(node))
end

#visit_or(node) ⇒ Object



72
73
74
75
# File 'lib/dry/logic/rule_compiler.rb', line 72

def visit_or(node)
  left, right = node
  visit(left).or(visit(right))
end

#visit_predicate(node) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/dry/logic/rule_compiler.rb', line 55

def visit_predicate(node)
  name, params = node
  predicate = Rule::Predicate.build(predicates[name])

  if params.size > 1
    args = params.map(&:last).reject { |val| val == Undefined }
    predicate.curry(*args)
  else
    predicate
  end
end

#visit_set(node) ⇒ Object



47
48
49
# File 'lib/dry/logic/rule_compiler.rb', line 47

def visit_set(node)
  Operations::Set.new(*call(node))
end

#visit_xor(node) ⇒ Object



77
78
79
80
# File 'lib/dry/logic/rule_compiler.rb', line 77

def visit_xor(node)
  left, right = node
  visit(left).xor(visit(right))
end