use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, schemars::JsonSchema)]
#[cfg_attr(feature = "server", derive(utoipa::ToSchema))]
#[serde(rename_all = "snake_case")]
pub enum PrincipalKindTag {
GlobalAdmin,
TenantAdmin,
User,
Service,
Agent,
System,
}
impl PrincipalKindTag {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::GlobalAdmin => "global_admin",
Self::TenantAdmin => "tenant_admin",
Self::User => "user",
Self::Service => "service",
Self::Agent => "agent",
Self::System => "system",
}
}
}
#[cfg(test)]
mod tests {
use super::PrincipalKindTag;
#[test]
fn tag_labels_match_serde() {
assert_eq!(PrincipalKindTag::GlobalAdmin.as_str(), "global_admin");
assert_eq!(PrincipalKindTag::TenantAdmin.as_str(), "tenant_admin");
assert_eq!(PrincipalKindTag::User.as_str(), "user");
assert_eq!(PrincipalKindTag::Service.as_str(), "service");
assert_eq!(PrincipalKindTag::Agent.as_str(), "agent");
assert_eq!(PrincipalKindTag::System.as_str(), "system");
}
#[test]
fn system_tag_round_trips_as_bare_string() {
assert_eq!(
serde_json::to_value(PrincipalKindTag::System).expect("serializes"),
serde_json::json!("system")
);
assert_eq!(
serde_json::from_value::<PrincipalKindTag>(serde_json::json!("system"))
.expect("deserializes"),
PrincipalKindTag::System
);
}
#[test]
fn tag_serializes_as_bare_string() {
assert_eq!(
serde_json::to_value(PrincipalKindTag::Service).expect("serializes"),
serde_json::json!("service")
);
assert_eq!(
serde_json::from_value::<PrincipalKindTag>(serde_json::json!("agent"))
.expect("deserializes"),
PrincipalKindTag::Agent
);
assert_eq!(
serde_json::to_value(PrincipalKindTag::GlobalAdmin).expect("serializes"),
serde_json::json!("global_admin")
);
}
}