Sha256: 2afd22c8ee391c07173808fd515f425596d5071ff5fc7e2ebb421969bd32c870

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

# frozen_string_literal: true

module RShade
  module Filter
    class FilterComposition
      include Enumerable
      AND_OP = :and
      OR_OP = :or
      UNARY_OP = :unary
      attr_reader :value, :left, :right
      attr_accessor :parent

      # @param [#call, Enumerable] left
      # @param [#call, Enumerable] right
      def initialize(value, left = nil, right = nil)
        @value = value
        @left = left
        @right = right
      end

      # rubocop:disable Metrics/CyclomaticComplexity
      def call(event)
        case value
        when UNARY_OP
          left&.call(event)
        when AND_OP
          left&.call(event) && right&.call(event)
        when OR_OP
          left&.call(event) || right&.call(event)
        else
          value.call(event)
        end
      end
      # rubocop:enable Metrics/CyclomaticComplexity

      def each(&block)
        yield value unless left && right
        left&.each(&block)
        right&.each(&block)
      end

      def filter(type, &block)
        filter = find do |f|
          f.is_a? type
        end
        filter&.config(&block)
      end

      # for debug purposes, show each filter and result of evaluation
      def filter_results(event)
        each_with_object([]) do |filter, arr|
          arr << [filter, filter.call(event)]
        end
      end

      def self.build(arr)
        ::RShade::Filter::FilterBuilder.build(arr)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rshade-0.2.2 lib/rshade/filter/filter_composition.rb