summaryrefslogtreecommitdiff
path: root/app/models/concerns/stepable.rb
blob: d00a049a0043fe2ff110f30151296e7edd4ab42a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# frozen_string_literal: true

module Stepable
  extend ActiveSupport::Concern

  def steps
    self.class._all_steps
  end

  def execute_steps
    initial_result = {}

    steps.inject(initial_result) do |previous_result, callback|
      result = method(callback).call

      if result[:status] == :error
        result[:failed_step] = callback

        break result
      end

      previous_result.merge(result)
    end
  end

  class_methods do
    def _all_steps
      @_all_steps ||= []
    end

    def steps(*methods)
      _all_steps.concat methods
    end
  end
end