Class: Lutaml::Lml::Executor::ConditionEvaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/lml/executor/condition_evaluator.rb

Overview

Evaluates collection validation conditions against instance data.

Conditions are simple DSL strings like “count >= 3” or “all? { |i| i.components.count > 0 }”. The evaluator parses a safe subset of forms — it never calls ‘eval` on arbitrary Ruby.

Supported condition forms:

"count >= N"                      — collection size comparison
"count == N", "count <= N", etc.
"all? { |i| i.path OP literal }"  — every instance matches
"any? { |i| i.path OP literal }"  — at least one instance matches

The block predicate supports a single comparison of an instance attribute path (e.g. ‘i.components.count`, `i.name`) against a literal (number, quoted string, true/false/nil) using one of `>, >=, <, <=, ==, !=`.

Constant Summary collapse

ConditionError =
Class.new(StandardError)
BLOCK_PREFIX =
/\A\s*(all|any)\?/.freeze
BLOCK_VAR =
/\A\s*\|(\w+)\|/.freeze
COMPARISON =
/\A\s*(.+?)\s*(>=|<=|==|!=|>|<)\s*(.+?)\s*\z/.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(instances) ⇒ ConditionEvaluator

Returns a new instance of ConditionEvaluator.



39
40
41
# File 'lib/lutaml/lml/executor/condition_evaluator.rb', line 39

def initialize(instances)
  @instances = instances
end

Class Method Details

.evaluate(collection, instances) ⇒ Object

Evaluate all validation conditions against a collection of instances. Returns an array of error strings (empty if all pass).



32
33
34
35
36
37
# File 'lib/lutaml/lml/executor/condition_evaluator.rb', line 32

def self.evaluate(collection, instances)
  return [] unless collection.validations&.any?
  return [] unless collection.is_a?(Collection)

  new(instances).evaluate_all(collection.validations)
end

Instance Method Details

#evaluate_all(conditions) ⇒ Object



43
44
45
46
47
48
49
# File 'lib/lutaml/lml/executor/condition_evaluator.rb', line 43

def evaluate_all(conditions)
  conditions.filter_map do |condition|
    evaluate(condition)
  rescue ConditionError => e
    "Validation failed: #{e.message}"
  end
end