use crate::models::CommandLevel; use crate::GeoffreyDatabaseModel; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)] pub enum UserID { DiscordUUID { discord_uuid: u64 }, MinecraftUUID { mc_uuid: String }, } #[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)] pub struct Player { pub id: Option, pub name: String, pub user_ids: Vec, pub auth_level: CommandLevel, } impl Player { pub fn new(name: &str, user_id: UserID) -> Self { Self { id: None, name: name.to_string(), user_ids: vec![user_id], auth_level: CommandLevel::REGISTERED, } } pub fn has_user_id(&self, user_id: &UserID) -> bool { self.user_ids.iter().any(|id| id == user_id) } } impl GeoffreyDatabaseModel for Player { fn id(&self) -> Option { self.id } fn set_id(&mut self, id: u64) { self.id = Some(id); } fn tree() -> String { "player".to_string() } fn check_unique(&self, o: &Self) -> bool { for user1_id in &self.user_ids { if o.user_ids.contains(user1_id) { return false; } } true } } #[cfg(test)] mod tests { use crate::models::player::UserID::{DiscordUUID, MinecraftUUID}; use crate::models::player::{Player, UserID}; use crate::GeoffreyDatabaseModel; #[test] fn test_player_check_unique() { let p1 = Player::new("CoolTest123", UserID::DiscordUUID { discord_uuid: 0u64 }); let p2 = Player::new("NotCoolTest123", UserID::DiscordUUID { discord_uuid: 1u64 }); assert!(p1.check_unique(&p2)); let p1 = Player::new( "CoolTest123", UserID::MinecraftUUID { mc_uuid: "0".to_string(), }, ); let p2 = Player::new( "NotCoolTest123", UserID::MinecraftUUID { mc_uuid: "0".to_string(), }, ); assert!(!p1.check_unique(&p2)); } }