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

Version Path
formalist-0.2.2 lib/formalist/validation/collection_rules_compiler.rb
formalist-0.2.1 lib/formalist/validation/collection_rules_compiler.rb
formalist-0.2.0 lib/formalist/validation/collection_rules_compiler.rb
formalist-0.1.0 lib/formalist/validation/collection_rules_compiler.rb