Sha256: 8fc60a073d6ed072c467cea02dd8affde2c83edefb7cb1b83e6fcbc1d04705a9

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

module NxtPipeline
  class Callbacks
    def initialize(pipeline:)
      @registry = build_registry
      @pipeline = pipeline
    end

    def register(path, callback)
      registry.resolve!(*path) << callback
    end

    def run(kind_of_callback, type, change_set)
      callbacks = registry.resolve!(kind_of_callback, type)
      return unless callbacks.any?

      callbacks.inject(change_set) do |changes, callback|
        run_callback(callback, changes)
      end
    end

    def around(type, change_set, &execution)
      around_callbacks = registry.resolve!(:around, type)
      return execution.call unless around_callbacks.any?

      callback_chain = around_callbacks.reverse.inject(execution) do |previous, callback|
        -> { callback.call(change_set, previous, pipeline) }
      end

      callback_chain.call
    end

    private

    attr_reader :registry, :pipeline

    def run_callback(callback, change_set)
      args = [change_set, pipeline]
      args = args.take(callback.arity) unless callback.arity.negative?
      callback.call(*args)
    end

    def build_registry
      NxtRegistry::Registry.new(:callbacks) do
        register(:before) do
          register(:step, [])
          register(:execution, [])
        end

        register(:around) do
          register(:step, [])
          register(:execution, [])
        end

        register(:after) do
          register(:step, [])
          register(:execution, [])
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nxt_pipeline-2.0.0 lib/nxt_pipeline/callbacks.rb