use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct ErrorHandlingConfig {
#[serde(default)]
pub retry: RetryConfig,
#[serde(default)]
pub dead_letter_queue: DeadLetterQueueConfig,
#[serde(default)]
pub circuit_breaker: ErrorHandlingCircuitBreakerConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RetryConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_max_retries")]
pub max_attempts: u32,
#[serde(default = "default_initial_backoff_ms")]
pub initial_backoff_ms: u64,
#[serde(default = "default_max_backoff_ms")]
pub max_backoff_ms: u64,
#[serde(default = "default_backoff_multiplier")]
pub backoff_multiplier: f64,
#[serde(default = "default_jitter_factor")]
pub jitter_factor: f64,
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
enabled: default_true(),
max_attempts: default_max_retries(),
initial_backoff_ms: default_initial_backoff_ms(),
max_backoff_ms: default_max_backoff_ms(),
backoff_multiplier: default_backoff_multiplier(),
jitter_factor: default_jitter_factor(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DeadLetterQueueConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_dlq_storage")]
pub storage: String,
#[serde(default = "default_max_entries")]
pub max_entries_per_task: usize,
#[serde(default = "default_retention_hours")]
pub retention_hours: u64,
#[serde(default)]
pub auto_reprocess_interval_minutes: u64,
}
impl Default for DeadLetterQueueConfig {
fn default() -> Self {
Self {
enabled: default_true(),
storage: default_dlq_storage(),
max_entries_per_task: default_max_entries(),
retention_hours: default_retention_hours(),
auto_reprocess_interval_minutes: 0,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ErrorHandlingCircuitBreakerConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_failure_threshold")]
pub failure_threshold_percent: u8,
#[serde(default = "default_min_requests")]
pub min_requests: u32,
#[serde(default = "default_reset_timeout")]
pub reset_timeout_seconds: u64,
#[serde(default = "default_half_open_requests")]
pub half_open_max_requests: u32,
}
impl Default for ErrorHandlingCircuitBreakerConfig {
fn default() -> Self {
Self {
enabled: false,
failure_threshold_percent: default_failure_threshold(),
min_requests: default_min_requests(),
reset_timeout_seconds: default_reset_timeout(),
half_open_max_requests: default_half_open_requests(),
}
}
}
fn default_true() -> bool {
true
}
fn default_max_retries() -> u32 {
3
}
fn default_initial_backoff_ms() -> u64 {
100
}
fn default_max_backoff_ms() -> u64 {
30000
}
fn default_backoff_multiplier() -> f64 {
2.0
}
fn default_jitter_factor() -> f64 {
0.1
}
fn default_dlq_storage() -> String {
"memory".to_string()
}
fn default_max_entries() -> usize {
10000
}
fn default_retention_hours() -> u64 {
24
}
fn default_failure_threshold() -> u8 {
50
}
fn default_min_requests() -> u32 {
10
}
fn default_reset_timeout() -> u64 {
60
}
fn default_half_open_requests() -> u32 {
5
}