use crate::{stream::StreamFormat, user}; #[cfg(feature = "rocket")] use rocket::{FromFormField, UriDisplayQuery}; 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 theme: Theme, pub permissions: PermissionSet, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] #[cfg_attr(feature = "rocket", derive(FromFormField, UriDisplayQuery))] #[serde(rename_all = "snake_case")] pub enum Theme { Dark, Light, } #[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, Transcode, ManageUsers, FederatedContent, GenerateInvite, StreamFormat(StreamFormat), AccessNode(String), } impl UserPermission { pub const ALL_ENUMERABLE: &'static [UserPermission] = { use UserPermission::*; &[Admin, Transcode, StreamFormat(user::StreamFormat::Original)] }; pub fn default_value(&self) -> bool { use user::StreamFormat::*; use UserPermission::*; matches!( self, Transcode | StreamFormat(Jhls | HlsMaster | HlsVariant | Matroska | Segment) ) } } impl Display for UserPermission { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&match self { UserPermission::FederatedContent => format!("access to federated content"), UserPermission::Admin => format!("administrative rights"), UserPermission::StreamFormat(StreamFormat::Original) => { format!("downloading the original media") } UserPermission::StreamFormat(StreamFormat::Matroska) => { format!("downloading a remuxed WebM/Matroska version of the media ") } UserPermission::StreamFormat(x) => { format!("downloading media via {x:?}") } 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:?}"), }) } }