class RWF::Flow
Constants
- ALLOWED_OPTIONS
Public Class Methods
call(io_params = {}, params = nil)
click to toggle source
# File lib/rwf/flow.rb, line 32 def call(io_params = {}, params = nil) new.(io_params, params) end
cure(*args)
click to toggle source
# File lib/rwf/flow.rb, line 24 def cure(*args) error(*args, cure: true) end
error(*args)
click to toggle source
# File lib/rwf/flow.rb, line 28 def error(*args) task(*args, type: :error) end
task(*args)
click to toggle source
# File lib/rwf/flow.rb, line 12 def task(*args) task, *options = *args task_options = {} options.each { |option| task_options.merge!(option) } task_options[:ptr] ||= task if task.is_a?(Symbol) extra_options = task_options.keys - ALLOWED_OPTIONS raise ConfigError, "Unknown task option(s): #{extra_options.join(',')}." unless extra_options.empty? tasks << [task, task_options] end
tasks()
click to toggle source
# File lib/rwf/flow.rb, line 8 def tasks @tasks ||= [] end
Public Instance Methods
call(io_params = {}, params = nil)
click to toggle source
# File lib/rwf/flow.rb, line 41 def call(io_params = {}, params = nil) result = Result.new(io_params) next_type = nil next_ptr = nil next_index = 0 while next_index < tasks.size task, options = tasks[next_index] if options[:type] == next_type || next_ptr next_type, next_ptr = execute_task(result, task, options, io_params, params) break if next_ptr == :end end next_index = decide_index(next_index, next_ptr) end result.initial? ? result.success! : result end
tasks()
click to toggle source
# File lib/rwf/flow.rb, line 37 def tasks self.class.tasks end
Private Instance Methods
decide_index(next_index, next_ptr)
click to toggle source
# File lib/rwf/flow.rb, line 104 def decide_index(next_index, next_ptr) if next_ptr find_index(next_ptr) else next_index + 1 end end
decide_ptr(task_result, on_success: nil, on_error: nil, **)
click to toggle source
# File lib/rwf/flow.rb, line 96 def decide_ptr(task_result, on_success: nil, on_error: nil, **) if on_success && task_result.success? on_success elsif on_error && task_result.failure? on_error end end
decide_type(result, task_result, cure: nil, **)
click to toggle source
# File lib/rwf/flow.rb, line 84 def decide_type(result, task_result, cure: nil, **) if result.okish? return if task_result.success? result.failure!(task_result.error) elsif task_result.success? && cure result.recover! return end :error end
execute_task(result, task, options, io_params, params)
click to toggle source
# File lib/rwf/flow.rb, line 63 def execute_task(result, task, options, io_params, params) callable = prepare_callable(task) task_result = callable.(io_params, params.nil? ? io_params : params) next_type = decide_type(result, task_result, options) next_ptr = task_result.redirect? ? task_result.ptr : decide_ptr(task_result, options) [next_type, next_ptr] end
find_index(next_ptr)
click to toggle source
# File lib/rwf/flow.rb, line 112 def find_index(next_ptr) tasks.index { |_task, ptr: nil, **| ptr == next_ptr } || raise(ConfigError, "Task with pointer '#{next_ptr}' not found.") end
prepare_callable(task)
click to toggle source
# File lib/rwf/flow.rb, line 72 def prepare_callable(task) if task.is_a?(Symbol) Task.new(method(task)) elsif task.respond_to?(:<) && task < Flow task elsif task.respond_to?(:call) Task.new(task) else raise Error, 'Not supported task.' end end