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:

  • An engine with all priority rules



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:

  • The rule to add

Returns:

  • A new engine with the rule added



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:

  • The decision context

Returns:

  • The decision made by the first applicable rule

Raises:

  • 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