use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Clone, Debug)]
pub struct RuntimeConfig {
pub log_level: String,
pub log_format: LogFormat,
pub restart_policy: RestartPolicy,
pub health_check_interval: Duration,
pub shutdown_timeout: Duration,
}
impl Default for RuntimeConfig {
fn default() -> Self {
Self {
log_level: "info".to_string(),
log_format: LogFormat::Pretty,
restart_policy: RestartPolicy::Never,
health_check_interval: Duration::from_secs(30),
shutdown_timeout: Duration::from_secs(10),
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum LogFormat {
Pretty,
Json,
Compact,
}
#[derive(Clone, Debug)]
pub enum RestartPolicy {
Never,
OnFailure {
max_retries: usize,
backoff: Duration,
},
Always {
backoff: Duration,
},
}
impl RestartPolicy {
pub fn should_restart(&self, attempt: usize) -> bool {
match self {
RestartPolicy::Never => false,
RestartPolicy::OnFailure { max_retries, .. } => attempt < *max_retries,
RestartPolicy::Always { .. } => true,
}
}
pub fn backoff_duration(&self, attempt: usize) -> Duration {
match self {
RestartPolicy::Never => Duration::from_secs(0),
RestartPolicy::OnFailure { backoff, .. } => *backoff * 2u32.pow(attempt as u32),
RestartPolicy::Always { backoff } => *backoff,
}
}
}