some function
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();
};
}