use serde::{Deserialize, Serialize}; use std::{collections::HashMap, fmt::Display}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct User { pub name: String, pub display_name: String, pub password: Vec, pub admin: bool, pub permissions: PermissionSet, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct PermissionSet(pub HashMap); #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] #[serde(rename_all = "snake_case")] pub enum UserPermission { Admin, OriginalStream, Transcode, ManageUsers, GenerateInvite, AccessNode(String), } impl UserPermission { pub const ALL_ENUMERABLE: &'static [UserPermission] = { use UserPermission::*; &[Admin, OriginalStream, Transcode] }; pub fn default_value(&self) -> bool { use UserPermission::*; matches!(self, Transcode) } } impl Display for UserPermission { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&match self { UserPermission::Admin => format!("administrative rights"), UserPermission::OriginalStream => format!("download of the original media"), UserPermission::Transcode => format!("transcoding"), UserPermission::ManageUsers => format!("management of all users"), UserPermission::GenerateInvite => format!("inviting new users"), UserPermission::AccessNode(s) => format!("access to library node {s:?}"), }) } }