use std::time::Duration;
#[derive(Debug, Clone, Copy)]
pub struct BackoffConfig {
pub minimum_delay_secs: f32,
pub maximum_delay_secs: f32,
pub factor: f32,
pub jitter_secs: f32,
}
#[derive(Debug, Clone, Copy)]
pub struct ExponentialBackoff {
config: BackoffConfig,
}
impl ExponentialBackoff {
pub const fn new(
minimum_delay_secs: f32,
maximum_delay_secs: f32,
factor: f32,
jitter_secs: f32,
) -> Self {
Self {
config: BackoffConfig {
minimum_delay_secs,
maximum_delay_secs,
factor,
jitter_secs,
},
}
}
pub fn new_from_config(config: BackoffConfig) -> Self {
Self { config }
}
pub fn duration(&self, attempt: u32) -> Duration {
let backoff = self.config.minimum_delay_secs * self.config.factor.powi(attempt as i32);
let backoff = backoff + rand::random::<f32>() * self.config.jitter_secs;
Duration::from_secs_f32(backoff.min(self.config.maximum_delay_secs))
}
}