Sha256: 768ade6e7050bcdc88e15a098cb7945bafb23d52bc26566fa771a498e5608d2f

Contents?: true

Size: 944 Bytes

Versions: 4

Compression:

Stored size: 944 Bytes

Contents

# frozen_string_literal: true

module RShade
  module Filter
    class FilterBuilder
      def self.build(arr)
        new.traverse(arr)
      end

      def map
        {
          or: [RShade::Filter::FilterComposition::OR_OP, 2],
          and: [RShade::Filter::FilterComposition::AND_OP, 2],
          unary: [RShade::Filter::FilterComposition::UNARY_OP, 1]
        }
      end

      def traverse(arr)
        op, arity = map[arr[0]]
        arg1 = arr[1]
        arg2 = nil
        arg2 = arr[2] if arity == 2
        arg1 = if arg1.is_a?(Array)
                 traverse(arg1)
               else
                 RShade::Filter::FilterComposition.new(arg1)
               end

        arg2 = if arg2.is_a?(Array)
                 traverse(arg2)
               else
                 RShade::Filter::FilterComposition.new(arg2)
               end

        RShade::Filter::FilterComposition.new(op, arg1, arg2)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rshade-0.2.2 lib/rshade/filter/filter_builder.rb
rshade-0.2.1 lib/rshade/filter/filter_builder.rb
rshade-0.2.0 lib/rshade/filter/filter_builder.rb
rshade-1.10.0 lib/rshade/filter/filter_builder.rb