class RailwayOperation::Strategy

Constants

DEFAULT

Public Class Methods

norm_exceptional(norm: {}, exceptional: {}) click to toggle source
# File lib/railway_operation/strategy.rb, line 33
def self.norm_exceptional(norm: {}, exceptional: {})
  lambda do |stepper, _, &step|
    begin
      _, new_info = step.call

      track_switch = norm.detect do |_, predicate|
        predicate.call(new_info.execution)
      end.first

      stepper.switch_to(track_switch) if track_switch
      stepper.continue
    rescue StandardError => e
      track_switch = exceptional.detect do |_, predicate|
        predicate.call(e)
      end.first

      stepper.raise_error(e, new_info || info) unless track_switch
      stepper.switch_to(track_switch).continue
    end
  end
end
standard() click to toggle source
# File lib/railway_operation/strategy.rb, line 19
def self.standard
  tracks = [:normal, :error_track, :fail_track]

  stepper_fn = Strategy.norm_exceptional(
    norm: {
      normal: ->(execution) { !execution.errored? },
      error_track: ->(execution) { execution.errored? },
      fail_track: ->(execution) { execution.failed? }
    }
  )

  [tracks, stepper_fn]
end