use crate::MarketDataError;
use std::time::Duration;
pub const DEFAULT_HEALTH_CHECK_ENABLED: bool = true;
pub const DEFAULT_HEARTBEAT_TIMEOUT_MS: u64 = 35_000;
pub const MIN_HEARTBEAT_TIMEOUT_MS: u64 = 5_000;
#[derive(Debug, Clone)]
pub struct HealthCheckConfig {
pub enabled: bool,
pub heartbeat_timeout: Duration,
}
impl Default for HealthCheckConfig {
fn default() -> Self {
Self {
enabled: DEFAULT_HEALTH_CHECK_ENABLED,
heartbeat_timeout: Duration::from_millis(DEFAULT_HEARTBEAT_TIMEOUT_MS),
}
}
}
impl HealthCheckConfig {
pub fn with_timeout(timeout: Duration) -> Result<Self, MarketDataError> {
if timeout < Duration::from_millis(MIN_HEARTBEAT_TIMEOUT_MS) {
return Err(MarketDataError::ConfigError(format!(
"heartbeat_timeout must be >= {}ms (got {:?})",
MIN_HEARTBEAT_TIMEOUT_MS, timeout
)));
}
Ok(Self {
enabled: true,
heartbeat_timeout: timeout,
})
}
pub fn disabled() -> Self {
Self {
enabled: false,
heartbeat_timeout: Duration::from_millis(DEFAULT_HEARTBEAT_TIMEOUT_MS),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = HealthCheckConfig::default();
assert!(config.enabled, "3.0 default is enabled=true");
assert_eq!(config.heartbeat_timeout, Duration::from_secs(35));
}
#[test]
fn test_default_config_timeout_is_35s() {
let config = HealthCheckConfig::default();
assert_eq!(config.heartbeat_timeout, Duration::from_secs(35));
}
#[test]
fn test_disabled_factory() {
let config = HealthCheckConfig::disabled();
assert!(!config.enabled);
assert_eq!(config.heartbeat_timeout, Duration::from_secs(35));
}
#[test]
fn test_with_timeout_accepts_60s() {
let config = HealthCheckConfig::with_timeout(Duration::from_secs(60)).unwrap();
assert!(config.enabled);
assert_eq!(config.heartbeat_timeout, Duration::from_secs(60));
}
#[test]
fn test_with_timeout_accepts_5s_minimum() {
let result = HealthCheckConfig::with_timeout(Duration::from_millis(5000));
assert!(result.is_ok(), "5s is at the floor and must be accepted");
}
#[test]
fn test_with_timeout_rejects_below_5s() {
let result = HealthCheckConfig::with_timeout(Duration::from_millis(4_999));
assert!(result.is_err(), "below 5s floor must be rejected");
}
}