use std::time::Duration;
#[derive(Debug, Clone, Copy)]
pub struct BackoffConfig {
pub max_attempts: u32,
pub initial_backoff: Duration,
}
impl BackoffConfig {
pub const DEFAULT_TRANSIENT: Self = Self {
max_attempts: 3,
initial_backoff: Duration::from_millis(500),
};
pub fn delay_for_attempt(&self, attempt: u32) -> Duration {
if attempt == 0 {
Duration::ZERO
} else {
self.initial_backoff * 2u32.pow(attempt - 1)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_transient_has_three_attempts() {
assert_eq!(BackoffConfig::DEFAULT_TRANSIENT.max_attempts, 3);
}
#[test]
fn delay_for_attempt_zero_is_zero() {
assert_eq!(
BackoffConfig::DEFAULT_TRANSIENT.delay_for_attempt(0),
Duration::ZERO
);
}
#[test]
fn delay_for_attempt_doubles() {
let c = BackoffConfig::DEFAULT_TRANSIENT;
assert_eq!(c.delay_for_attempt(1), Duration::from_millis(500));
assert_eq!(c.delay_for_attempt(2), Duration::from_millis(1000));
assert_eq!(c.delay_for_attempt(3), Duration::from_millis(2000));
}
}