madruga 0.1.3

Retry resiliente com backoff.
Documentation
use rand::Rng;
use std::time::Duration;

#[derive(Clone, Debug)]
pub enum Backoff {
    Fixed(Duration),
    Exponential {
        base: Duration,
        factor: f64,
        max: Duration,
    },
    Jitter {
        base: Duration,
        max_jitter: Duration,
    },
}

impl Backoff {
    pub fn delay_for(&self, attempt: usize) -> Duration {
        match self {
            Backoff::Fixed(d) => *d,
            Backoff::Exponential { base, factor, max } => {
                let delay = base.as_millis() as f64 * factor.powi(attempt as i32);
                Duration::from_millis(delay.min(max.as_millis() as f64) as u64)
            }
            Backoff::Jitter { base, max_jitter } => {
                let mut rng = rand::rng();
                let jitter = rng.random_range(0..=max_jitter.as_millis() as u64);
                *base + Duration::from_millis(jitter)
            }
        }
    }
}