use std::time::{Duration, Instant};
#[derive(Debug, Clone)]
pub struct HealthStatus {
pub aur_api: ServiceStatus,
pub latency: Option<Duration>,
pub checked_at: Instant,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ServiceStatus {
Healthy,
Degraded,
Unreachable,
Timeout,
}
impl ServiceStatus {
#[must_use]
pub const fn is_operational(&self) -> bool {
matches!(self, Self::Healthy | Self::Degraded)
}
}
impl HealthStatus {
#[must_use]
pub const fn is_healthy(&self) -> bool {
self.aur_api.is_operational()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_service_status_is_operational() {
assert!(ServiceStatus::Healthy.is_operational());
assert!(ServiceStatus::Degraded.is_operational());
assert!(!ServiceStatus::Unreachable.is_operational());
assert!(!ServiceStatus::Timeout.is_operational());
}
#[test]
fn test_health_status_is_healthy() {
let healthy = HealthStatus {
aur_api: ServiceStatus::Healthy,
latency: Some(Duration::from_millis(100)),
checked_at: Instant::now(),
};
assert!(healthy.is_healthy());
let degraded = HealthStatus {
aur_api: ServiceStatus::Degraded,
latency: Some(Duration::from_secs(3)),
checked_at: Instant::now(),
};
assert!(degraded.is_healthy());
let unreachable = HealthStatus {
aur_api: ServiceStatus::Unreachable,
latency: None,
checked_at: Instant::now(),
};
assert!(!unreachable.is_healthy());
let timeout = HealthStatus {
aur_api: ServiceStatus::Timeout,
latency: None,
checked_at: Instant::now(),
};
assert!(!timeout.is_healthy());
}
}