use std::collections::HashMap; use cfg_file::ConfigFile; use serde::{Deserialize, Serialize}; use string_proc::snake_case; pub type MemberId = String; #[derive(Debug, Eq, Clone, ConfigFile, Serialize, Deserialize)] pub struct Member { /// Member ID, the unique identifier of the member id: String, /// Member metadata metadata: HashMap, } impl Default for Member { fn default() -> Self { Self::new("default_user") } } impl PartialEq for Member { fn eq(&self, other: &Self) -> bool { self.id == other.id } } impl std::fmt::Display for Member { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.id) } } impl std::convert::AsRef for Member { fn as_ref(&self) -> &str { &self.id } } impl Member { /// Create member struct by id pub fn new(new_id: impl Into) -> Self { Self { id: snake_case!(new_id.into()), metadata: HashMap::new(), } } /// Get member id pub fn id(&self) -> String { self.id.clone() } /// Get metadata pub fn metadata(&self, key: impl Into) -> Option<&String> { self.metadata.get(&key.into()) } /// Set metadata pub fn set_metadata( &mut self, key: impl AsRef, value: impl Into, ) -> Option { self.metadata.insert(key.as_ref().to_string(), value.into()) } }