module CrackPipe::Action::Exec
Public Class Methods
action(action, context, track = :default)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 13 def action(action, context, track = :default) action.class.steps.each_with_object([]) do |s, results| next unless track == s.track results!(results, action, s, context).last.tap do |r| action.after_flow_control(r) context = r[:context] track = r[:next] return results if r[:signal] == :halt end end end
call(action, context, track = :default)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 9 def call(action, context, track = :default) Result.new(action(action, context, track)) end
flow_control_hash(action, step, context, output)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 25 def flow_control_hash(action, step, context, output) success = success_with_step?(action, step, output) { exec: step.exec, track: step.track, next: success ? step.track : :fail, context: context.dup }.merge(flow_control_with_output(output, success)) end
flow_control_with_output(output, success)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 36 def flow_control_with_output(output, success) case output when Signal { signal: output.type, output: output.value, success: output.success.nil? ? success : output.success } else { output: output, success: success } end end
halt(output, success = nil)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 49 def halt(output, success = nil) throw(:signal, Signal.new(:halt, output, success)) end
step(action, step, context)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 53 def step(action, step, context) kwargs = kwargs_with_context(action, context) output = catch(:signal) do if (e = step.exec).is_a?(Symbol) action.public_send(e, context, **kwargs) else e.call(context, **kwargs) end end action.after_step(output) end
success_with_step?(action, step, output)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 67 def success_with_step?(action, step, output) step.always_pass? || step.track != :fail && !action.failure?(output) end
Private Class Methods
kwargs_with_context(action, context)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 73 def kwargs_with_context(action, context) return context if action.kwargs_overrides.empty? context.merge(action.kwargs_overrides) end
results!(results, action, step, context)
click to toggle source
# File lib/crack_pipe/action/exec.rb, line 78 def results!(results, action, step, context) o = step(action, step, context) return results.concat(o.history) if o.is_a?(Result) results << flow_control_hash(action, step, context, o) end