Class: Lutaml::Xml::Decisions::DecisionEngine
- Inherits:
-
Object
- Object
- Lutaml::Xml::Decisions::DecisionEngine
- 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
-
#rules ⇒ Object
readonly
Returns the value of attribute rules.
Class Method Summary collapse
-
.default ⇒ DecisionEngine
Create a default engine with all standard rules.
Instance Method Summary collapse
-
#add_rule(rule) ⇒ DecisionEngine
Add a rule to the engine.
-
#execute(context) ⇒ Decision
Evaluate all rules and return the first applicable decision.
-
#initialize(rules = []) ⇒ DecisionEngine
constructor
A new instance of DecisionEngine.
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
#rules ⇒ Object (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
.default ⇒ DecisionEngine
Create a default engine with all standard 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
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
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 |