use std::str::FromStr;
#[derive(Debug, Clone, Default, PartialOrd, PartialEq, Eq, Copy)]
pub enum SafeMode {
Unsafe = 0,
Safe,
Server,
#[default]
Secure,
}
impl FromStr for SafeMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"unsafe" => Ok(Self::Unsafe),
"safe" => Ok(Self::Safe),
"server" => Ok(Self::Server),
"secure" => Ok(Self::Secure),
_ => Err(format!(
"invalid safe mode: '{s}', expected: unsafe, safe, server, secure"
)),
}
}
}
impl SafeMode {
#[must_use]
pub const fn level(self) -> u8 {
match self {
Self::Unsafe => 0,
Self::Safe => 1,
Self::Server => 10,
Self::Secure => 20,
}
}
#[must_use]
pub const fn name(self) -> &'static str {
match self {
Self::Unsafe => "unsafe",
Self::Safe => "safe",
Self::Server => "server",
Self::Secure => "secure",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_from_str() -> Result<(), String> {
assert_eq!(SafeMode::from_str("unsafe")?, SafeMode::Unsafe);
assert_eq!(SafeMode::from_str("UNSAFE")?, SafeMode::Unsafe);
assert_eq!(SafeMode::from_str("safe")?, SafeMode::Safe);
assert_eq!(SafeMode::from_str("server")?, SafeMode::Server);
assert_eq!(SafeMode::from_str("secure")?, SafeMode::Secure);
assert!(SafeMode::from_str("invalid").is_err());
Ok(())
}
#[test]
fn test_ordering() {
assert!(SafeMode::Unsafe < SafeMode::Safe);
assert!(SafeMode::Safe < SafeMode::Server);
assert!(SafeMode::Server < SafeMode::Secure);
}
}