use crate::config::ServerConfig;
use crate::config::types::AccessMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub struct AccessHealth {
pub mode: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub reach: Option<&'static str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub decisions: Option<&'static str>,
}
impl From<&ServerConfig> for AccessHealth {
fn from(config: &ServerConfig) -> Self {
let mode = config.access_mode();
Self {
mode: match mode {
AccessMode::Open => "open",
AccessMode::Gated => "gated",
},
reach: (mode == AccessMode::Open).then(|| config.open_reach().word()),
decisions: config
.auth
.as_ref()
.and_then(|auth| auth.lys.as_ref())
.map(|lys| lys.decisions.word()),
}
}
}
impl AccessHealth {
pub const BEARER: Self = Self {
mode: "gated",
reach: None,
decisions: None,
};
#[must_use]
pub fn words(&self) -> String {
let mut words = vec![format!("mode {}", self.mode)];
words.extend(self.reach.map(|reach| format!("reach {reach}")));
words.extend(
self.decisions
.map(|decisions| format!("decisions {decisions}")),
);
words.join(", ")
}
}