class Interceptors::Executor

Attributes

context[R]
middleware[R]

Public Class Methods

new(context = Context.new) click to toggle source
# File lib/interceptors/executor.rb, line 5
def initialize(context = Context.new)
  @middleware = Middleware.new
  @context = context
end

Public Instance Methods

call() click to toggle source
# File lib/interceptors/executor.rb, line 14
def call
  while (interceptor, step = fetch_next)
    with_exception_handling(interceptor) do
      interceptor.public_send(step, context)
    end
  end

  context
end
register(interceptor) click to toggle source
# File lib/interceptors/executor.rb, line 10
def register(interceptor)
  middleware.enqueue(interceptor)
end

Private Instance Methods

fetch_next() click to toggle source
# File lib/interceptors/executor.rb, line 26
def fetch_next
  if context[:error]
    [middleware.pop, :on_error] unless middleware.on_leave.empty?
  elsif !middleware.on_enter.empty?
    interceptor = middleware.dequeue
    middleware.push(interceptor)
    [interceptor, :on_enter]
  elsif !middleware.on_leave.empty?
    [middleware.pop, :on_leave]
  end
end
with_exception_handling(interceptor) { || ... } click to toggle source
# File lib/interceptors/executor.rb, line 38
def with_exception_handling(interceptor)
  yield
rescue StandardError => e
  context[:error] = e
  context[:error_raised_at] = interceptor.class.name
end