use std::sync::Arc;
use scc::HashMap as SccHashMap;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum ServingStatus {
Unknown,
#[default]
Serving,
NotServing,
ServiceUnknown,
}
#[derive(Clone, Default)]
pub struct HealthRegistry {
inner: Arc<SccHashMap<String, ServingStatus>>,
}
impl HealthRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn set_status(&self, service: impl Into<String>, status: ServingStatus) {
self.inner.upsert_sync(service.into(), status);
}
pub fn status_of(&self, service: &str) -> ServingStatus {
self
.inner
.get_sync(service)
.map_or(ServingStatus::ServiceUnknown, |e| *e.get())
}
pub fn snapshot(&self) -> Vec<(String, ServingStatus)> {
let mut out = Vec::new();
self.inner.iter_sync(|k, v| {
out.push((k.clone(), *v));
true
});
out
}
}