use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ResilienceConfig {
#[serde(default)]
pub circuit_breaker: CircuitBreakerConfig,
#[serde(default)]
pub retry: RetryConfig,
#[serde(default)]
pub rate_limit: RateLimitConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CircuitBreakerConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_failure_threshold")]
pub failure_threshold: f32,
#[serde(default = "default_window_size")]
pub window_size: u32,
#[serde(default = "default_reset_timeout")]
pub reset_timeout_secs: u64,
}
impl Default for CircuitBreakerConfig {
fn default() -> Self {
Self {
enabled: true,
failure_threshold: 0.5,
window_size: 20,
reset_timeout_secs: 60,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_max_attempts")]
pub max_attempts: u32,
#[serde(default = "default_backoff_ms")]
pub backoff_ms: u64,
#[serde(default = "default_max_backoff_ms")]
pub max_backoff_ms: u64,
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
enabled: true,
max_attempts: 3,
backoff_ms: 100,
max_backoff_ms: 5000,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_requests_per_minute")]
pub requests_per_minute: u32,
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
enabled: false,
requests_per_minute: 100,
}
}
}
fn default_true() -> bool {
true
}
fn default_failure_threshold() -> f32 {
0.5
}
fn default_window_size() -> u32 {
20
}
fn default_reset_timeout() -> u64 {
60
}
fn default_max_attempts() -> u32 {
3
}
fn default_backoff_ms() -> u64 {
100
}
fn default_max_backoff_ms() -> u64 {
5000
}
fn default_requests_per_minute() -> u32 {
100
}