Module: Eco::API::UseCases::UseCaseChain::Chaining

Included in:
Eco::API::UseCases::UseCaseChain
Defined in:
lib/eco/api/usecases/use_case_chain/chaining.rb

Constant Summary collapse

MAX_CHAINS =
70
@@num_chains =
0

Instance Method Summary collapse

Instance Method Details

#chain(usecase = nil, &block) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/eco/api/usecases/use_case_chain/chaining.rb', line 33

def chain(usecase = nil, &block)
  @@num_chains += 1

  msg  = "Reached maximum number of chained use cases (#{MAX_CHAINS}). "
  msg << "Looks like a recursive cyclic chain 'use'"
  raise msg if @@num_chains >= MAX_CHAINS

  msg = 'A UseCase can only be chained with another UseCase'
  raise msg if usecase && !usecase.is_a?(UseCase)

  msg = 'Missuse. Please use either parameter or block but not both'
  raise msg if block_given? && usecase

  usecase = block if block_given?
  @chains.push(usecase)
  self
end

#use(preserve_chains: false, recursive: false) ⇒ Object



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
# File 'lib/eco/api/usecases/use_case_chain/chaining.rb', line 6

def use(preserve_chains: false, recursive: false)
  UseCase.new(
    @name,
    type:  @type,
    model: @model,
    root:  @root,
    &@case
  ).tap do |newcase|
    next unless preserve_chains

    chain_use = {preserve_chains: recursive, recursive: recursive}

    @chains = @chains.map do |usecase|
      if usecase.respond_to?(:call)
        proc do |usegroup|
          usecase = usecase.call(usegroup)
          usecase.use(**chain_use).chain_to(newcase)
          usecase
        end
      elsif usecase.is_a?(UseCase)
        usecase.use(**chain_use).chain_to(newcase)
        usecase
      end
    end
  end
end