#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum EnforcementLevel {
#[default]
Strict,
BestEffort {
reason: String,
},
None {
reason: String,
},
}
impl EnforcementLevel {
#[inline]
pub fn strict() -> Self {
Self::Strict
}
pub fn best_effort(reason: impl Into<String>) -> Self {
Self::BestEffort {
reason: reason.into(),
}
}
pub fn none(reason: impl Into<String>) -> Self {
Self::None {
reason: reason.into(),
}
}
#[inline]
pub fn is_strict(&self) -> bool {
matches!(self, Self::Strict)
}
#[inline]
pub fn is_best_effort(&self) -> bool {
matches!(self, Self::BestEffort { .. })
}
#[inline]
pub fn is_none(&self) -> bool {
matches!(self, Self::None { .. })
}
pub fn reason(&self) -> Option<&str> {
match self {
Self::Strict => None,
Self::BestEffort { reason } | Self::None { reason } => Some(reason),
}
}
}
impl std::fmt::Display for EnforcementLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Strict => write!(f, "strict"),
Self::BestEffort { reason } => write!(f, "best-effort ({})", reason),
Self::None { reason } => write!(f, "none ({})", reason),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_enforcement_level() {
let strict = EnforcementLevel::strict();
assert!(strict.is_strict());
assert!(!strict.is_best_effort());
assert!(strict.reason().is_none());
let best = EnforcementLevel::best_effort("missing CAP_SYS_ADMIN");
assert!(best.is_best_effort());
assert_eq!(best.reason(), Some("missing CAP_SYS_ADMIN"));
let none = EnforcementLevel::none("NUMA not supported");
assert!(none.is_none());
assert_eq!(none.reason(), Some("NUMA not supported"));
}
#[test]
fn test_enforcement_display() {
assert_eq!(format!("{}", EnforcementLevel::strict()), "strict");
assert_eq!(
format!("{}", EnforcementLevel::best_effort("reason")),
"best-effort (reason)"
);
}
}