-
Notifications
You must be signed in to change notification settings - Fork 329
Open
Description
I recently came across the salvo implementation for middleware (control flow) and I really like the use of the async_recursion combined with a simple cursor to allow middleware to run without any additional lifetimes. I think we could probably clean up the middleware to do something similar possibly.
/// Call next handler. If get next handler and executed, returns true, otherwise returns false.
///
/// If resposne's statuse code is error or is redirection, all reset handlers will skipped.
#[inline]
#[async_recursion]
pub async fn call_next(&mut self, req: &mut Request, depot: &mut Depot, res: &mut Response) -> bool {
if let Some(code) = res.status_code() {
if code.is_client_error() || code.is_server_error() || code.is_redirection() {
self.skip_rest();
return false;
}
}
if let Some(handler) = self.handlers.get(self.cursor) {
self.cursor += 1;
handler.clone().handle(req, depot, res, self).await;
if self.has_next() {
self.call_next(req, depot, res).await;
}
true
} else {
false
}
}
Metadata
Metadata
Assignees
Labels
No labels