use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub enum HealthStatus {
Healthy,
Degraded,
Unhealthy,
Unknown,
}
impl HealthStatus {
pub const fn is_healthy(self) -> bool {
matches!(self, Self::Healthy)
}
pub const fn is_degraded(self) -> bool {
matches!(self, Self::Degraded)
}
pub const fn is_unhealthy(self) -> bool {
matches!(self, Self::Unhealthy)
}
pub const fn is_unknown(self) -> bool {
matches!(self, Self::Unknown)
}
}
impl fmt::Display for HealthStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let value = match self {
Self::Healthy => "HEALTHY",
Self::Degraded => "DEGRADED",
Self::Unhealthy => "UNHEALTHY",
Self::Unknown => "UNKNOWN",
};
f.write_str(value)
}
}
#[cfg(test)]
mod tests {
use super::HealthStatus;
#[test]
fn variants_are_distinct() {
assert_ne!(HealthStatus::Healthy, HealthStatus::Degraded);
assert_ne!(HealthStatus::Healthy, HealthStatus::Unhealthy);
assert_ne!(HealthStatus::Healthy, HealthStatus::Unknown);
assert_ne!(HealthStatus::Degraded, HealthStatus::Unhealthy);
assert_ne!(HealthStatus::Degraded, HealthStatus::Unknown);
assert_ne!(HealthStatus::Unhealthy, HealthStatus::Unknown);
}
#[test]
fn classification_helpers_match_their_variants() {
assert!(HealthStatus::Healthy.is_healthy());
assert!(HealthStatus::Degraded.is_degraded());
assert!(HealthStatus::Unhealthy.is_unhealthy());
assert!(HealthStatus::Unknown.is_unknown());
assert!(!HealthStatus::Healthy.is_degraded());
assert!(!HealthStatus::Degraded.is_unhealthy());
assert!(!HealthStatus::Unhealthy.is_unknown());
assert!(!HealthStatus::Unknown.is_healthy());
}
#[test]
fn status_is_copy_and_cloneable() {
let original = HealthStatus::Degraded;
let copied = original;
let cloned = original;
assert_eq!(original, copied);
assert_eq!(original, cloned);
}
#[test]
fn display_uses_stable_uppercase_names() {
assert_eq!(HealthStatus::Healthy.to_string(), "HEALTHY");
assert_eq!(HealthStatus::Degraded.to_string(), "DEGRADED");
assert_eq!(HealthStatus::Unhealthy.to_string(), "UNHEALTHY");
assert_eq!(HealthStatus::Unknown.to_string(), "UNKNOWN");
}
}