blob: 3aacf72825db4475c745828a3f7b12ce2c6877be [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library shelf.stack;
import 'handler.dart';
import 'middleware.dart';
/// A helper that makes it easy to compose a set of [Middleware] and a
/// [Handler].
///
/// var handler = const Stack()
/// .addMiddleware(loggingMiddleware)
/// .addMiddleware(cachingMiddleware)
/// .addHandler(application);
class Stack {
final Stack _parent;
final Middleware _middleware;
const Stack()
: _middleware = null,
_parent = null;
Stack._(this._middleware, this._parent);
/// Returns a new [Stack] with [middleware] added to the existing set of
/// [Middleware].
///
/// [middleware] will be the last [Middleware] to process a request and
/// the first to process a response.
Stack addMiddleware(Middleware middleware) =>
new Stack._(middleware, this);
/// Returns a new [Handler] with [handler] as the final processor of a
/// [Request] if all of the middleware in the stack have passed the request
/// through.
Handler addHandler(Handler handler) {
if (_middleware == null) return handler;
return _parent.addHandler(_middleware(handler));
}
/// Exposes this stack of [Middleware] as a single middleware instance.
Middleware get middleware => addHandler;
}