class Lutaml::Xml::Decisions::DecisionEngine
to lowest priority. First rule that applies determines the decision.
Uses Chain of Responsibility pattern to evaluate rules from highest
Decision Engine - Evaluates rules in priority order
def self.default
-
(DecisionEngine)- An engine with all priority rules
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
def add_rule(rule)
-
(DecisionEngine)- A new engine with the rule added
Parameters:
-
rule(DecisionRule) -- The rule to add
def add_rule(rule) new_rules = @rules + [rule] DecisionEngine.new(new_rules) end
def execute(context)
-
(RuntimeError)- If no rule applies (should never happen)
Returns:
-
(Decision)- The decision made by the first applicable rule
Parameters:
-
context(DecisionContext) -- The decision context
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
def initialize(rules = [])
def initialize(rules = []) @rules = rules.sort # Sort by priority (lower = higher priority) freeze end