#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CommonState<'a> {
Health,
Errors,
Sensor,
Alert { alert_key: &'a str },
EvidenceSelf,
EvidenceDevice { device: &'a str },
EvidenceNames { ip_slug: &'a str },
CatalogEntity { entity_id: &'a str },
CatalogAlias { old_id: &'a str },
CatalogPdns { ip_slug: &'a str },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CommonFamily {
Health,
Errors,
Sensor,
Alert,
EvidenceSelf,
EvidenceDevice,
EvidenceNames,
}
impl CommonFamily {
pub const ALL: [CommonFamily; 7] = [
CommonFamily::Health,
CommonFamily::Errors,
CommonFamily::Sensor,
CommonFamily::Alert,
CommonFamily::EvidenceSelf,
CommonFamily::EvidenceDevice,
CommonFamily::EvidenceNames,
];
pub fn token(self) -> &'static str {
match self {
CommonFamily::Health => "health",
CommonFamily::Errors => "errors",
CommonFamily::Sensor => "sensor",
CommonFamily::Alert => "alert",
CommonFamily::EvidenceSelf => "evidence_self",
CommonFamily::EvidenceDevice => "evidence_device",
CommonFamily::EvidenceNames => "evidence_names",
}
}
pub fn prefix(self) -> &'static [&'static str] {
match self {
CommonFamily::Health => &["health"],
CommonFamily::Errors => &["errors"],
CommonFamily::Sensor => &["sensor"],
CommonFamily::Alert => &["alert"],
CommonFamily::EvidenceSelf => &["evidence", "self"],
CommonFamily::EvidenceDevice => &["evidence", "device"],
CommonFamily::EvidenceNames => &["evidence", "names"],
}
}
pub fn var(self) -> Option<&'static str> {
match self {
CommonFamily::Alert => Some("alert_key"),
CommonFamily::EvidenceDevice => Some("device"),
CommonFamily::EvidenceNames => Some("ip_slug"),
CommonFamily::Health
| CommonFamily::Errors
| CommonFamily::Sensor
| CommonFamily::EvidenceSelf => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::grammar::is_valid_plain_chunk;
#[test]
fn family_table_is_grammar_legal_and_distinct() {
let mut tokens = Vec::new();
for f in CommonFamily::ALL {
assert!(
f.prefix().iter().all(|c| is_valid_plain_chunk(c)),
"{f:?} prefix violates RFC 03 §2"
);
assert!(!f.prefix().is_empty(), "{f:?} has no path");
tokens.push(f.token());
}
tokens.sort_unstable();
tokens.dedup();
assert_eq!(tokens.len(), CommonFamily::ALL.len());
}
}