use serde::Deserialize;
#[derive(Debug, Clone, Default, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum BackoffStrategy {
#[default]
Exponential,
Fibonacci,
Constant,
}
#[derive(Debug, Clone, Deserialize)]
pub struct RetryConfig {
#[serde(default = "RetryConfig::default_enabled")]
pub enabled: bool,
#[serde(default = "RetryConfig::default_max_attempts")]
pub max_attempts: u32,
#[serde(default = "RetryConfig::default_initial_backoff_ms")]
pub initial_backoff_ms: u64,
#[serde(default = "RetryConfig::default_max_backoff_secs")]
pub max_backoff_secs: u64,
#[serde(default)]
pub backoff_strategy: BackoffStrategy,
#[serde(default = "RetryConfig::default_jitter_factor")]
pub jitter_factor: f64,
}
impl RetryConfig {
fn default_enabled() -> bool {
true
}
fn default_max_attempts() -> u32 {
3
}
fn default_initial_backoff_ms() -> u64 {
100
}
fn default_max_backoff_secs() -> u64 {
2
}
fn default_jitter_factor() -> f64 {
1.0 }
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
enabled: Self::default_enabled(),
max_attempts: Self::default_max_attempts(),
initial_backoff_ms: Self::default_initial_backoff_ms(),
max_backoff_secs: Self::default_max_backoff_secs(),
backoff_strategy: BackoffStrategy::default(),
jitter_factor: Self::default_jitter_factor(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct ReliabilityConfig {
#[serde(default)]
pub retry: RetryConfig,
}