use crate::{HealthChecker, HealthReport};
use std::{collections::HashMap, sync::Arc};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CheckCategory {
Liveness,
Readiness,
}
pub struct HealthRegistry {
liveness_checkers: HashMap<String, Arc<dyn HealthChecker>>,
readiness_checkers: HashMap<String, Arc<dyn HealthChecker>>,
}
impl HealthRegistry {
pub fn new() -> Self {
Self { liveness_checkers: HashMap::new(), readiness_checkers: HashMap::new() }
}
pub fn add_checker(&mut self, name: String, checker: Arc<dyn HealthChecker>, category: CheckCategory) {
match category {
CheckCategory::Liveness => {
self.liveness_checkers.insert(name, checker);
}
CheckCategory::Readiness => {
self.readiness_checkers.insert(name, checker);
}
}
}
pub fn remove_checker(&mut self, name: &str, category: CheckCategory) {
match category {
CheckCategory::Liveness => {
self.liveness_checkers.remove(name);
}
CheckCategory::Readiness => {
self.readiness_checkers.remove(name);
}
}
}
pub async fn check_liveness(&self) -> HealthReport {
let mut checks = Vec::with_capacity(self.liveness_checkers.len());
for checker in self.liveness_checkers.values() {
checks.push(checker.check().await);
}
HealthReport::new(checks)
}
pub async fn check_readiness(&self) -> HealthReport {
let mut checks = Vec::with_capacity(self.readiness_checkers.len());
for checker in self.readiness_checkers.values() {
checks.push(checker.check().await);
}
HealthReport::new(checks)
}
}
impl Default for HealthRegistry {
fn default() -> Self {
Self::new()
}
}