use std::time::Duration;
use reqwest_retry::{
policies::{ExponentialBackoff, ExponentialBackoffBuilder},
RetryTransientMiddleware, Retryable, RetryableStrategy,
};
pub fn get_retry_strategy(
min_retry_interval: u64,
max_retry_interval: u64,
max_retries: u32,
) -> RetryTransientMiddleware<ExponentialBackoff, Retry> {
let retry_policy = ExponentialBackoffBuilder::default()
.retry_bounds(
Duration::from_millis(min_retry_interval),
Duration::from_millis(max_retry_interval),
)
.build_with_max_retries(max_retries);
RetryTransientMiddleware::new_with_policy_and_strategy(retry_policy, Retry)
}
pub struct Retry;
impl RetryableStrategy for Retry {
fn handle(
&self,
res: &Result<reqwest::Response, reqwest_middleware::Error>,
) -> Option<Retryable> {
match res {
Ok(success) => {
if success.status() != 200 {
Some(Retryable::Transient)
} else {
None
}
}
Err(error) => reqwest_retry::default_on_request_failure(error),
}
}
}