class Trailblazer::Macro::Wrap::Wrapped

behaves like an operation so it plays with Nested and simply calls the operation in the user-provided block.

Public Class Methods

new(operation, user_wrap, outputs) click to toggle source
# File lib/trailblazer/macro/wrap.rb, line 30
def initialize(operation, user_wrap, outputs)
  user_wrap = deprecate_positional_wrap_signature(user_wrap)

  @operation  = operation
  @user_wrap  = user_wrap

  # Since in the user block, you can return Railway.pass! etc, we need to map
  # those to the actual wrapped operation's end.
  @signal_to_output = {
    Operation::Railway.pass!      => outputs[:success].signal,
    Operation::Railway.fail!      => outputs[:failure].signal,
    Operation::Railway.pass_fast! => outputs[:pass_fast].signal,
    Operation::Railway.fail_fast! => outputs[:fail_fast].signal,
    true               => outputs[:success].signal,
    false              => outputs[:failure].signal,
    nil                => outputs[:failure].signal,
  }
end

Public Instance Methods

call((ctx, flow_options), **circuit_options) click to toggle source
# File lib/trailblazer/macro/wrap.rb, line 49
def call((ctx, flow_options), **circuit_options)
  block_calling_wrapped = -> {
    call_wrapped_activity([ctx, flow_options], **circuit_options)
  }

  # call the user's Wrap {} block in the operation.
  # This will invoke block_calling_wrapped above if the user block yields.
  returned = @user_wrap.([ctx, flow_options], **circuit_options, &block_calling_wrapped)

  # {returned} can be
  #   1. {circuit interface return} from the begin block, because the wrapped OP passed
  #   2. {task interface return} because the user block returns "customized" signals, true of fale

  if returned.is_a?(Array) # 1. {circuit interface return}, new style.
    signal, (ctx, flow_options) = returned
  else                     # 2. {task interface return}, only a signal (or true/false)
    # TODO: deprecate this?
    signal = returned
  end

  # Use the original {signal} if there's no mapping.
  # This usually means signal is an End instance or a custom signal.
  signal = @signal_to_output.fetch(signal, signal)

  return signal, [ctx, flow_options]
end
call_wrapped_activity((ctx, flow_options), **circuit_options) click to toggle source
# File lib/trailblazer/macro/wrap.rb, line 76
def call_wrapped_activity((ctx, flow_options), **circuit_options)
  @operation.to_h[:activity].([ctx, flow_options], **circuit_options) # :exec_context is this instance.
end

Private Instance Methods

deprecate_positional_wrap_signature(user_wrap) click to toggle source
# File lib/trailblazer/macro/wrap.rb, line 19
        def deprecate_positional_wrap_signature(user_wrap)
  parameters = user_wrap.is_a?(Module) ? user_wrap.method(:call).parameters : user_wrap.parameters

  return user_wrap if parameters[0] == [:req] # means ((ctx, flow_options), *, &block), "new style"

  ->((ctx, flow_options), **circuit_options, &block) do
    warn "[Trailblazer] Wrap handlers have a new signature: ((ctx), *, &block)"
    user_wrap.(ctx, &block)
  end
end