Index: pkg/shelf/lib/src/stack.dart |
diff --git a/pkg/shelf/lib/src/stack.dart b/pkg/shelf/lib/src/stack.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3aacf72825db4475c745828a3f7b12ce2c6877be |
--- /dev/null |
+++ b/pkg/shelf/lib/src/stack.dart |
@@ -0,0 +1,45 @@ |
+// 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; |
+} |