class Course::Operation

Public Class Methods

call(*input, &block) click to toggle source
# File lib/course/operation.rb, line 6
def call(*input, &block)
  new.call(*input, &block)
end
inherited(child) click to toggle source
# File lib/course/operation.rb, line 18
def inherited(child)
  child.instance_variable_set('@steps', @steps.clone)
end
step(name = nil, **options, &block) click to toggle source
# File lib/course/operation.rb, line 10
def step(name = nil, **options, &block)
  steps << Course::Step.new(name, block, **options)
end
steps() click to toggle source
# File lib/course/operation.rb, line 14
def steps
  @steps ||= []
end

Public Instance Methods

call(*input) { |result| ... } click to toggle source
# File lib/course/operation.rb, line 23
def call(*input, &block)
  execute_steps(*input, &block)
  return yield result if block_given?
  result
end
result() click to toggle source
# File lib/course/operation.rb, line 29
def result
  Course::Result.new(output: @output, failure: @failure)
end

Private Instance Methods

execute(next_input, step) click to toggle source
# File lib/course/operation.rb, line 45
def execute(next_input, step)
  if step.method?
    execute_step(method(step.target), *next_input)
  elsif step.block?
    execute_step(step.block, *next_input)
  else
    execute_operation(step.target, *next_input)
  end
end
execute_operation(klass, *input) click to toggle source
# File lib/course/operation.rb, line 63
def execute_operation(klass, *input)
  klass.call(*input) do |res|
    res.on_success do |output|
      return output
    end
    res.on_fail do |err|
      raise FailureError, err
    end
  end
end
execute_step(next_step, *input) click to toggle source
# File lib/course/operation.rb, line 55
def execute_step(next_step, *input)
  if input.is_a?(Array) && (next_step.arity == input.count || next_step.arity == -1)
    next_step.call(*input)
  else
    next_step.call(input)
  end
end
execute_steps(*input) click to toggle source
# File lib/course/operation.rb, line 39
def execute_steps(*input)
  @output = self.class.steps.inject(input, &method(:execute))
rescue FailureError => e
  @failure = e.failure
end
fail(type, data = nil) click to toggle source
# File lib/course/operation.rb, line 35
def fail(type, data = nil)
  raise FailureError, Failure.new(type, data)
end