use std::str::FromStr;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum TrustTier {
Isolated,
#[default]
Restricted,
Trusted,
}
impl TrustTier {
pub fn as_str(self) -> &'static str {
match self {
TrustTier::Isolated => "isolated",
TrustTier::Restricted => "restricted",
TrustTier::Trusted => "trusted",
}
}
}
impl FromStr for TrustTier {
type Err = UnknownTier;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"isolated" => Ok(TrustTier::Isolated),
"restricted" => Ok(TrustTier::Restricted),
"trusted" => Ok(TrustTier::Trusted),
_ => Err(UnknownTier),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct UnknownTier;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_wire_spelling_round_trips() {
for tier in [
TrustTier::Isolated,
TrustTier::Restricted,
TrustTier::Trusted,
] {
assert_eq!(TrustTier::from_str(tier.as_str()), Ok(tier));
}
}
#[test]
fn test_unknown_spelling_is_rejected() {
assert_eq!(TrustTier::from_str("admin"), Err(UnknownTier));
}
}