use std::fmt;
use serde::Serialize;
#[derive(Debug, Clone, Copy, Serialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub(crate) enum HealthStatus {
Ok,
Warning,
Error,
Unverified,
}
impl fmt::Display for HealthStatus {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::Ok => "OK",
Self::Warning => "warning",
Self::Error => "error",
Self::Unverified => "unverified",
})
}
}
#[derive(Debug, Serialize)]
pub(crate) struct HealthItem {
pub(crate) name: String,
pub(crate) status: HealthStatus,
pub(crate) detail: String,
}
#[derive(Debug, Default, Serialize)]
pub(crate) struct HealthReport {
pub(crate) checks: Vec<HealthItem>,
}
impl HealthReport {
pub(crate) fn push(
&mut self,
name: impl Into<String>,
status: HealthStatus,
detail: impl Into<String>,
) {
self.checks.push(HealthItem {
name: name.into(),
status,
detail: detail.into(),
});
}
pub(crate) fn has_error(&self) -> bool {
self.checks
.iter()
.any(|item| item.status == HealthStatus::Error)
}
pub(crate) fn print_human(&self) {
for item in &self.checks {
println!("{:<10} {:<10} {}", item.name, item.status, item.detail);
}
}
pub(crate) fn print_json(&self) -> Result<(), serde_json::Error> {
println!("{}", serde_json::to_string_pretty(self)?);
Ok(())
}
}