some function

Middleware some(
  1. Iterable<Middleware> middlewares, {
  2. SomeErrorThrower createThrower()?,
})

Creates middleware that tries candidates in order until one succeeds.

Implementation

Middleware some(
  Iterable<Middleware> middlewares, {

  /// Creates the error thrower for the active request.
  SomeErrorThrower Function()? createThrower,
}) {
  if (middlewares.isEmpty) {
    throw ArgumentError.value(middlewares, 'middlewares', 'Must not be empty.');
  }

  return (event, next) async {
    Future<Response>? result;
    Future<Response> sharedNext() => result ??= next();
    final thrower = createThrower?.call() ?? SomeErrorThrower.first();

    for (final middleware in middlewares) {
      try {
        return await middleware(event, sharedNext);
      } catch (error, stackTrace) {
        thrower.track(error, stackTrace);
      }
    }

    thrower.throws();
  };
}