Tower Retry
use tower::retry::{Retry, Policy};
#[derive(Clone)]
struct RetryPolicy {
max_attempts: u32,
}
impl<Req: Clone, Res, E: IsTransient> Policy<Req, Res, E> for RetryPolicy {
type Future = Ready<Self>;
fn retry(&self, req: &Req, result: Result<&Res, &E>) -> Option<Self::Future> {
match result {
Ok(_) => None,
Err(e) if e.is_transient() && self.max_attempts > 0 => {
Some(ready(RetryPolicy { max_attempts: self.max_attempts - 1 }))
}
_ => None,
}
}
fn clone_request(&self, req: &Req) -> Option<Req> { Some(req.clone()) }
}