Sha256: 9b1a56ae419973927e6990907b5a7c501d2faef865b05081cf7a0b5a48c5c6c4

Contents?: true

Size: 1.1 KB

Versions: 7

Compression:

Stored size: 1.1 KB

Contents

module NulogyMessageBusConsumer
  class Pipeline
    def initialize(steps)
      @steps = steps
    end

    def invoke
      convert_steps_into_lambda.call
    end

    def insert(step, after:)
      index = @steps.find_index { |s| s.is_a?(after) }
      @steps.insert(index + 1, step)
    end

    def append(step)
      @steps << step
    end

    private

    def convert_steps_into_lambda
      last_step = ->(**_) { raise "Handlers are the end of the line. Do not use yield." }

      @steps.reverse.reduce(last_step) do |composed_steps, previous_step|
        lambda do |**args|
          invoke_next = compose_with_merged_args(args, composed_steps)
          previous_step.call(**args, &invoke_next)
        end
      end
    end

    def compose_with_merged_args(existing_args, func)
      lambda do |**yielded_args|
        args_to_be_overridden = existing_args.keys & yielded_args.keys
        if args_to_be_overridden.any?
          raise "Cannot override existing argument(s): #{args_to_be_overridden.join(", ")}"
        end

        func.call(**existing_args.merge(yielded_args))
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
nulogy_message_bus_consumer-3.0.0 lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-2.0.1 lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-2.0.0 lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-1.0.0 lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-0.5.0 lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-1.0.0.alpha lib/nulogy_message_bus_consumer/pipeline.rb
nulogy_message_bus_consumer-0.4.0 lib/nulogy_message_bus_consumer/pipeline.rb