use std::time::Duration;
#[derive(Debug, Clone)]
pub struct RetryPolicy {
pub max_retries: usize,
pub base_delay: Duration,
pub max_delay: Duration,
pub backoff_multiplier: f64,
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_retries: 3,
base_delay: Duration::from_millis(100),
max_delay: Duration::from_secs(10),
backoff_multiplier: 2.0,
}
}
}
impl RetryPolicy {
pub fn new(max_retries: usize) -> Self {
Self {
max_retries,
..Default::default()
}
}
pub fn with_base_delay(mut self, delay: Duration) -> Self {
self.base_delay = delay;
self
}
pub fn with_max_delay(mut self, delay: Duration) -> Self {
self.max_delay = delay;
self
}
pub fn with_backoff_multiplier(mut self, multiplier: f64) -> Self {
self.backoff_multiplier = multiplier;
self
}
pub fn backoff_duration(&self, attempt: usize) -> Duration {
let delay =
self.base_delay.as_millis() as f64 * self.backoff_multiplier.powi(attempt as i32);
let delay_ms = delay.min(self.max_delay.as_millis() as f64) as u64;
Duration::from_millis(delay_ms)
}
}