Sha256: 37233259043e88043c5a0467ac716add011b446e9d2c7a3f27aa1e5f24cfd627

Contents?: true

Size: 1.32 KB

Versions: 10

Compression:

Stored size: 1.32 KB

Contents

# frozen_string_literal: true

require_relative 'switch/case'

module Realize
  class Logical
    # This type of transformer can be categorized as a "comparator", meaning its intended
    # desire is not a value resolution or value formatting, but a branching resolution.
    # Specifically, you can define cases where, if the value matches, the transformers for the
    # case would be executed.  If no case is matched then the default_transformers will be
    # executed.
    class Switch
      acts_as_hashable

      attr_reader :cases, :default_transformers, :key

      def initialize(cases: [], default_transformers: [], key:)
        raise ArgumentError, 'key is required' if key.to_s.empty?

        @cases                = Case.array(cases)
        @default_transformers = Transformers.array(default_transformers)
        @key                  = key

        freeze
      end

      def transform(resolver, value, time, record)
        resolved_value = resolver.get(record, key)
        matched_case   = cases.find { |c| c.match?(resolved_value) }
        transformers   = matched_case ? matched_case.transformers : default_transformers

        return value if transformers.empty?

        transformers.inject(value) do |memo, transformer|
          transformer.transform(resolver, memo, time, record)
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
realize-1.2.0 lib/realize/logical/switch.rb
realize-1.2.0.pre.alpha lib/realize/logical/switch.rb
realize-1.1.1 lib/realize/logical/switch.rb
realize-1.1.1.pre.alpha lib/realize/logical/switch.rb
realize-1.1.0 lib/realize/logical/switch.rb
realize-1.0.0 lib/realize/logical/switch.rb
realize-1.0.0.pre.alpha.3 lib/realize/logical/switch.rb
realize-1.0.0.pre.alpha.2 lib/realize/logical/switch.rb
realize-1.0.0.pre.alpha.1 lib/realize/logical/switch.rb
realize-1.0.0.pre.alpha lib/realize/logical/switch.rb