use serde::{Deserialize, Serialize}; use chrono::{DateTime, Utc}; use crate::GeoffreyDatabaseModel; pub enum Permissions { ModelGet = 0, ModelPost, Command, ModCommand, Admin, } #[derive(Serialize, Deserialize, Debug, Clone)] struct Token { pub id: Option, permission: u64, pub created: DateTime, pub modified: DateTime } impl Token { pub fn new() -> Self { Self { id: None, permission: 0, created: Utc::now(), modified: Utc::now() } } pub fn set_permission(&mut self, permission: Permissions) { self.permission = self.permission | (1u64 << permission as u32); } pub fn clear_permission(&mut self, permission: Permissions) { self.permission = self.permission & !(1u64 << permission as u32); } pub fn check_permission(&self, permission: Permissions) -> bool { (self.permission >> permission as u32) & 0x1u64 == 0x1u64 } pub fn clear_all_permission(&mut self) { self.permission = 0x0u64; } } impl GeoffreyDatabaseModel for Token { fn id(&self) -> Option { self.id } fn set_id(&mut self, id: u64) { self.id = Some(id); } fn tree() -> String { "token".to_string() } } impl PartialEq for Token { fn eq(&self, other: &Self) -> bool { self.permission == other.permission } } #[cfg(test)] mod tests { use crate::models::token::{Token, Permissions}; #[test] fn test_token() { let mut token = Token::new(0); token.set_permission(Permissions::ModelGet); assert_eq!(token.permission, 0x1u64); token.set_permission(Permissions::ModelPost); assert_eq!(token.permission, 0x3u64); } }