Module: Philiprehberger::RuleEngine

Defined in:
lib/philiprehberger/rule_engine.rb,
lib/philiprehberger/rule_engine/rule.rb,
lib/philiprehberger/rule_engine/engine.rb,
lib/philiprehberger/rule_engine/helpers.rb,
lib/philiprehberger/rule_engine/version.rb

Defined Under Namespace

Modules: Helpers Classes: Engine, Error, Rule

Constant Summary collapse

VERSION =
'0.5.0'

Class Method Summary collapse

Class Method Details

.from_h(data) {|name| ... } ⇒ Engine

Reconstruct an engine from a serialized hash. The resolver block maps rule names to condition/action implementations.

Parameters:

  • data (Hash)

    serialized engine data from Engine#to_h

Yields:

  • (name)

    block that receives a rule name and should configure the rule

Returns:

  • (Engine)

    the reconstructed engine

Raises:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/philiprehberger/rule_engine.rb', line 27

def self.from_h(data, &resolver)
  raise Error, 'resolver block is required' unless resolver

  mode = (data[:mode] || data['mode'] || :all).to_sym
  engine = Engine.new(mode: mode)

  rules = data[:rules] || data['rules'] || []
  rules.each do |rule_data|
    name = rule_data[:name] || rule_data['name']
    priority_val = rule_data[:priority] || rule_data['priority'] || 0
    enabled_val = rule_data.key?(:enabled) ? rule_data[:enabled] : rule_data.fetch('enabled', true)
    tags_val = (rule_data[:tags] || rule_data['tags'] || []).map(&:to_sym)

    r = engine.add_rule(name, tags: tags_val) do
      priority priority_val
    end
    r.enabled = enabled_val
    resolver.call(r)
  end

  engine
end

.new(mode: :all) {|engine| ... } ⇒ Engine

Create a new rule engine.

Parameters:

  • mode (Symbol) (defaults to: :all)

    :all to run all matching rules, :first to stop after first match

Yields:

  • (engine)

    block for defining rules using the DSL

Returns:

  • (Engine)

    the configured engine



17
18
19
# File 'lib/philiprehberger/rule_engine.rb', line 17

def self.new(mode: :all, &block)
  Engine.new(mode: mode, &block)
end