class Grape::Middleware::Stack
It allows to insert and insert after
Class to handle the stack of middlewares based on ActionDispatch::MiddlewareStack
def [](index)
def [](index) middlewares[index] end
def assert_index(index, where)
def assert_index(index, where) i = index.is_a?(Integer) ? index : middlewares.index(index) i || raise("No such middleware to insert #{where}: #{index.inspect}") end
def build(builder = Rack::Builder.new)
-
(Rack::Builder)
- the builder object with our middlewares applied
def build(builder = Rack::Builder.new) others.shift(others.size).each { |m| merge_with(m) } middlewares.each do |m| m.use_in(builder) end builder end
def concat(other_specs)
-
other_specs
(Array
) -- An array of middleware specifications (e.g. [[:use, klass], [:insert_before, *args]])
def concat(other_specs) @others << Array(other_specs).reject { |o| o.first == :use } merge_with(Array(other_specs).select { |o| o.first == :use }) end
def each(&block)
def each(&block) @middlewares.each(&block) end
def initialize
def initialize @middlewares = [] @others = [] end
def insert(index, *args, &block)
def insert(index, *args, &block) index = assert_index(index, :before) middleware = self.class::Middleware.new(*args, &block) middlewares.insert(index, middleware) end
def insert_after(index, *args, &block)
def insert_after(index, *args, &block) index = assert_index(index, :after) insert(index + 1, *args, &block) end
def last
def last middlewares.last end
def merge_with(middleware_specs)
def merge_with(middleware_specs) middleware_specs.each do |operation, *args| if args.last.is_a?(Proc) last_proc = args.pop public_send(operation, *args, &last_proc) else public_send(operation, *args) end end end
def size
def size middlewares.size end
def use(...)
def use(...) middleware = self.class::Middleware.new(...) middlewares.push(middleware) end