class Grape::Middleware::Stack
It allows to insert and insert after
Class to handle the stack of middlewares based on ActionDispatch::MiddlewareStack
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
-
(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 { |m| m.build(builder) } 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) use, not_use = other_specs.partition { |o| o.first == :use } others << not_use merge_with(use) end
def initialize
def initialize @middlewares = [] @others = [] end
def insert(index, klass, *args, &block)
def insert(index, klass, *args, &block) index = assert_index(index, :before) middlewares.insert(index, self.class::Middleware.new(klass, args, block)) end
def insert_after(index, ...)
def insert_after(index, ...) index = assert_index(index, :after) insert(index + 1, ...) end
def merge_with(middleware_specs)
def merge_with(middleware_specs) middleware_specs.each do |operation, klass, *args| if args.last.is_a?(Proc) last_proc = args.pop public_send(operation, klass, *args, &last_proc) else public_send(operation, klass, *args) end end end
def use(klass, *args, &block)
def use(klass, *args, &block) middleware = self.class::Middleware.new(klass, args, block) middlewares.push(middleware) end