defineHandler function

Handler defineHandler(
  1. Handler handler, {
  2. Iterable<Middleware> middleware = const [],
  3. ErrorHandler? onError,
})

Defines a route handler with local middleware and error handling.

Local middleware wraps only the returned handler. Local onError catches errors thrown by that local middleware chain or the wrapped handler.

Implementation

Handler defineHandler(
  Handler handler, {
  Iterable<Middleware> middleware = const [],
  ErrorHandler? onError,
}) {
  final localMiddleware = List<Middleware>.unmodifiable(middleware);
  if (localMiddleware.isEmpty && onError == null) {
    return handler;
  }

  return (event) async {
    Future<Response> runLocalChain() async {
      Next next = () async => await handler(event);
      for (final current in localMiddleware.reversed) {
        final previous = next;
        next = () async => await current(event, previous);
      }

      return next();
    }

    if (onError == null) {
      return await runLocalChain();
    }

    try {
      return await runLocalChain();
    } catch (error, stackTrace) {
      return await onError(error, stackTrace, event);
    }
  };
}