use std::path::PathBuf;
use std::time::Duration;
use serde::Deserialize;
#[derive(Debug, Clone, PartialEq, Deserialize)]
pub struct RetryPolicy {
pub max_attempts: u32,
pub initial_delay_ms: u64,
pub backoff_multiplier: f64,
pub max_delay_ms: u64,
#[serde(default)]
pub on_exhausted: ExhaustedPolicy,
}
impl RetryPolicy {
pub fn delay_for(&self, retry: u32) -> Duration {
let ms = (self.initial_delay_ms as f64 * self.backoff_multiplier.powi(retry as i32))
.min(self.max_delay_ms as f64) as u64;
Duration::from_millis(ms)
}
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_attempts: 3,
initial_delay_ms: 100,
backoff_multiplier: 2.0,
max_delay_ms: 10_000,
on_exhausted: ExhaustedPolicy::default(),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ExhaustedPolicy {
#[default]
Propagate,
DeadLetter { path: PathBuf },
}