use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::env;
fn default_cb_enabled() -> bool {
false
}
fn default_cb_threshold() -> u32 {
5
}
fn default_cb_reset_timeout() -> u64 {
30
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CircuitBreakerConfig {
#[serde(default = "default_cb_enabled")]
pub enabled: bool,
#[serde(default = "default_cb_threshold")]
pub failure_threshold: u32,
#[serde(default = "default_cb_reset_timeout")]
pub reset_timeout: u64,
#[serde(default)]
pub overrides: HashMap<String, CircuitBreakerOverride>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CircuitBreakerOverride {
pub failure_threshold: Option<u32>,
pub reset_timeout: Option<u64>,
}
impl Default for CircuitBreakerConfig {
fn default() -> Self {
Self {
enabled: default_cb_enabled(),
failure_threshold: default_cb_threshold(),
reset_timeout: default_cb_reset_timeout(),
overrides: HashMap::new(),
}
}
}
impl CircuitBreakerConfig {
pub(super) fn apply_env_overrides(&mut self) {
if let Ok(val) = env::var("NORA_CB_ENABLED") {
self.enabled = val.to_lowercase() == "true" || val == "1";
}
if let Ok(val) = env::var("NORA_CB_THRESHOLD") {
super::parse_env_warn("NORA_CB_THRESHOLD", &val, &mut self.failure_threshold);
}
if let Ok(val) = env::var("NORA_CB_RESET_TIMEOUT") {
super::parse_env_warn("NORA_CB_RESET_TIMEOUT", &val, &mut self.reset_timeout);
}
}
}