use uuid::Uuid; use crate::errors::AdminError; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum AdminRole { SuperAdmin, Operator, Viewer, } #[derive(Debug, Clone)] pub struct AdminActor { pub id: Uuid, pub username: String, pub display_name: String, pub role: AdminRole, pub must_change_password: bool, } impl AdminActor { pub fn level(role: AdminRole) -> u8 { match role { AdminRole::SuperAdmin => 3, AdminRole::Operator => 2, AdminRole::Viewer => 1, } } pub fn is_super(&self) -> bool { matches!(self.role, AdminRole::SuperAdmin) } pub fn require(&self, minimum: AdminRole) -> Result<(), AdminError> { if Self::level(self.role) >= Self::level(minimum) { Ok(()) } else { Err(AdminError::Forbidden) } } }