class Micro::Cases::Flow

Constants

IsAUseCaseWithDefaults
IsAValidUseCase

Attributes

use_cases[R]

Public Class Methods

build(args) click to toggle source
# File lib/micro/cases/flow.rb, line 11
def self.build(args)
  use_cases = Utils.map_use_cases(args)

  raise Error::InvalidUseCases if use_cases.none?(&IsAValidUseCase)

  new(use_cases)
end
new(use_cases) click to toggle source
# File lib/micro/cases/flow.rb, line 19
def initialize(use_cases)
  @use_cases = use_cases.dup.freeze
  @next_ones = use_cases.dup
  @first = @next_ones.shift
end

Public Instance Methods

__call__(input = Kind::Empty::HASH)
Alias for: call
call(input = Kind::Empty::HASH) { |result_wrapper| ... } click to toggle source
# File lib/micro/cases/flow.rb, line 37
def call(input = Kind::Empty::HASH)
  result = call!(input: input, result: Case::Result.new)

  return result unless block_given?

  result_wrapper = ::Micro::Case::Result::Wrapper.new(result)

  yield(result_wrapper)

  result_wrapper.output
end
Also aliased as: __call__
call!(input:, result:) click to toggle source
# File lib/micro/cases/flow.rb, line 29
def call!(input:, result:)
  first_result = __call_use_case(@first, result, input)

  return first_result if @next_ones.empty?

  __call_next_use_cases(first_result)
end
inspect() click to toggle source
# File lib/micro/cases/flow.rb, line 25
def inspect
  '#<(%s) use_cases=%s>' % [self.class, @use_cases]
end
then(use_case = nil, &block) click to toggle source
# File lib/micro/cases/flow.rb, line 55
def then(use_case = nil, &block)
  can_yield_self = respond_to?(:yield_self)

  if block
    raise_invalid_invocation_of_the_then_method if use_case
    raise NotImplementedError if !can_yield_self

    yield_self(&block)
  else
    return yield_self if !use_case && can_yield_self

    raise_invalid_invocation_of_the_then_method unless ::Micro.case_or_flow?(use_case)

    self.call.then(use_case)
  end
end
to_proc() click to toggle source
# File lib/micro/cases/flow.rb, line 51
def to_proc
  Proc.new { |arg| call(arg) }
end

Private Instance Methods

__build_use_case(use_case, result, input) click to toggle source
# File lib/micro/cases/flow.rb, line 90
def __build_use_case(use_case, result, input)
  return use_case.__new__(result, input) unless use_case.is_a?(Array)

  use_case[0].__new__(result, input.merge(use_case[1]))
end
__call_next_use_cases(first_result) click to toggle source
# File lib/micro/cases/flow.rb, line 82
def __call_next_use_cases(first_result)
  @next_ones.reduce(first_result) do |result, use_case|
    break result if result.failure?

    __call_use_case(use_case, result, result.data)
  end
end
__call_use_case(use_case, result, input) click to toggle source
# File lib/micro/cases/flow.rb, line 78
def __call_use_case(use_case, result, input)
  __build_use_case(use_case, result, input).__call__
end
raise_invalid_invocation_of_the_then_method() click to toggle source
# File lib/micro/cases/flow.rb, line 74
def raise_invalid_invocation_of_the_then_method
  raise Case::Error::InvalidInvocationOfTheThenMethod.new("#{self.class.name}#")
end