chain function

Sequentially runs a list of handlers of middleware, and returns early if any does not return true. Works well with Router.chain.

Implementation

RequestHandler chain(Iterable<RequestHandler> handlers) {
  return (req, res) {
    Future Function()? runPipeline;

    for (var handler in handlers) {
      //if (handler == null) break;

      if (runPipeline == null) {
        runPipeline = () => Future.sync(() => handler(req, res));
      } else {
        var current = runPipeline;
        runPipeline = () => current().then((result) => !res.isOpen
            ? Future.value(result)
            : req.app!.executeHandler(handler, req, res));
      }
    }

    runPipeline ??= () => Future.value();
    return runPipeline();
  };
}