Sha256: d3a0ce8b42aa2058a555f13af733d16b13806931762562ead0edf28fb81068f9

Contents?: true

Size: 1.44 KB

Versions: 5

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module IIInteractor
  module Core
    extend ActiveSupport::Concern
    include Coactive::Initializer

    included do
      self.context_class = IIInteractor::Context
    end

    def initialize(*)
      super
    end

    def call_all
      planned = case IIInteractor.config.traversal
        when :preorder
          [self] + coactors
        when :postorder
          coactors + [self]
        when :inorder
          planned = coactors.in_groups(2, false)
          planned[0] + [self] + planned[1]
        end

      planned.each do |interactor|
        if interactor == self
          call_self
        else
          interactor.new(@context).call_all
        end
        break if @context.stopped?
      end
    end

    def call_self
      call.tap do
        @context.called!(self)
      end
    end

    def call
    end

    def rollback
    end

    def inform(*args)
      @context.call_block!(*([self] + args))
    end

    def fail!(data = {})
      @context.fail!(data)
      raise UnprogressableError.new(@context)
    end

    def stop!(data = {})
      @context.stop!(data)
    end

    class_methods do
      def call(args = {}, &block)
        interactor = new(args, &block)
        interactor.call_all
        interactor.context
      rescue UnprogressableError
        interactor.context._status.called.reverse.each do |called|
          called.rollback
        end
        interactor.context
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ii_interactor-2.3.1 lib/ii_interactor/core.rb
ii_interactor-2.3.0 lib/ii_interactor/core.rb
ii_interactor-2.2.2 lib/ii_interactor/core.rb
ii_interactor-2.2.1 lib/ii_interactor/core.rb
ii_interactor-2.2.0 lib/ii_interactor/core.rb