Sha256: 259a17fb84718638118cdfba8048d18954a75c33f6d742341d4852e44445cd59
Contents?: true
Size: 1.61 KB
Versions: 4
Compression:
Stored size: 1.61 KB
Contents
module Formalist module Validation class CollectionRulesCompiler attr_reader :target_name def initialize(target_name) @target_name = target_name end def call(ast) ast.map { |node| visit(node) }.reduce([], :concat).each_slice(2).to_a end private def visit(node) name, nodes = node send(:"visit_#{name}", nodes) end def visit_set(node) name, rules = node return [] unless name == target_name rules.flatten(1) end def visit_each(node) name, rule = node return [] unless name == target_name visit(rule) end def visit_predicate(node) name, args = node [:predicate, node] end def visit_and(node) left, right = node flatten_logical_operation(:and, [visit(left), visit(right)]) end def visit_or(node) left, right = node flatten_logical_operation(:or, [visit(left), visit(right)]) end def visit_xor(node) left, right = node flatten_logical_operation(:xor, [visit(left), visit(right)]) end def visit_implication(node) left, right = node flatten_logical_operation(:implication, [visit(left), visit(right)]) end def method_missing(name, *args) [] end def flatten_logical_operation(name, contents) contents = contents.select(&:any?) if contents.length == 0 [] elsif contents.length == 1 contents.first else [name, contents] end end end end end
Version data entries
4 entries across 4 versions & 1 rubygems