use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CheckCategory {
Toolchain,
CertifiedStack,
Database,
Cache,
Storage,
Mail,
Jobs,
Observability,
Security,
CrossStack,
ApplicationGraph,
Framework,
}
impl CheckCategory {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Toolchain => "toolchain",
Self::CertifiedStack => "certified_stack",
Self::Database => "database",
Self::Cache => "cache",
Self::Storage => "storage",
Self::Mail => "mail",
Self::Jobs => "jobs",
Self::Observability => "observability",
Self::Security => "security",
Self::CrossStack => "cross_stack",
Self::ApplicationGraph => "application_graph",
Self::Framework => "framework",
}
}
}
impl fmt::Display for CheckCategory {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn categories_are_stable_lowercase_single_token_strings() {
let all = [
CheckCategory::Toolchain,
CheckCategory::CertifiedStack,
CheckCategory::Database,
CheckCategory::Cache,
CheckCategory::Storage,
CheckCategory::Mail,
CheckCategory::Jobs,
CheckCategory::Observability,
CheckCategory::Security,
CheckCategory::CrossStack,
CheckCategory::ApplicationGraph,
CheckCategory::Framework,
];
let names: Vec<&str> = all.iter().map(|c| c.as_str()).collect();
let mut unique = names.clone();
unique.sort();
unique.dedup();
assert_eq!(unique.len(), all.len(), "categories must be distinct");
for n in &names {
assert!(!n.contains(' '), "category must be a single token: {n}");
assert_eq!(*n, n.to_lowercase(), "category must be lowercase: {n}");
}
}
}