Class: Lutaml::Xml::Decisions::DecisionEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/xml/decisions/decision_engine.rb

Overview

Decision Engine - Evaluates rules in priority order

Uses Chain of Responsibility pattern to evaluate rules from highest to lowest priority. First rule that applies determines the decision.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rules = []) ⇒ DecisionEngine

Returns a new instance of DecisionEngine.



14
15
16
17
# File 'lib/lutaml/xml/decisions/decision_engine.rb', line 14

def initialize(rules = [])
  @rules = rules.sort # Sort by priority (lower = higher priority)
  freeze
end

Instance Attribute Details

#rulesObject (readonly)

Returns the value of attribute rules.



12
13
14
# File 'lib/lutaml/xml/decisions/decision_engine.rb', line 12

def rules
  @rules
end

Class Method Details

.defaultDecisionEngine

Create a default engine with all standard rules

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/lutaml/xml/decisions/decision_engine.rb', line 47

def self.default
  rules = [
    Rules::InheritFromParentRule.new,
    Rules::UsedPrefixRule.new,
    Rules::ElementFormDefaultUnqualifiedRule.new,
    Rules::HoistedOnParentRule.new,
    Rules::ElementFormOptionRule.new,
    Rules::ReuseParentPrefixRule.new,
    Rules::FormatPreservationRule.new,
    Rules::ExplicitOptionRule.new,
    Rules::NamespaceScopeRule.new,
    Rules::AttributeUsageRule.new,
    Rules::ElementFormDefaultRule.new,
    Rules::DefaultPreferenceRule.new, # Must be last (catch-all)
  ]
  new(rules)
end

Instance Method Details

#add_rule(rule) ⇒ DecisionEngine

Add a rule to the engine

Parameters:

Returns:



39
40
41
42
# File 'lib/lutaml/xml/decisions/decision_engine.rb', line 39

def add_rule(rule)
  new_rules = @rules + [rule]
  DecisionEngine.new(new_rules)
end

#execute(context) ⇒ Decision

Evaluate all rules and return the first applicable decision

Parameters:

Returns:

  • (Decision)

    The decision made by the first applicable rule

Raises:

  • (RuntimeError)

    If no rule applies (should never happen)



24
25
26
27
28
29
30
31
32
33
# File 'lib/lutaml/xml/decisions/decision_engine.rb', line 24

def execute(context)
  @rules.each do |rule|
    if rule.applies?(context)
      return rule.decide(context)
    end
  end

  # This should never happen if DefaultPreferenceRule is included
  raise "No decision rule applied for context: #{context.inspect}"
end