use puniyu_common::path::CONFIG_DIR;
use puniyu_common::toml;
use serde::{Deserialize, Serialize};
use std::{
collections::HashMap,
sync::{Arc, LazyLock, RwLock},
};
pub(crate) static GROUP_CONFIG: LazyLock<Arc<RwLock<GroupConfig>>> = LazyLock::new(|| {
Arc::new(RwLock::new(toml::read_config(CONFIG_DIR.as_path(), "group").unwrap_or_default()))
});
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupConfigOption {
#[serde(default = "default_group_cd")]
pub cd: u8,
#[serde(default = "default_group_user_cd")]
pub user_cd: u8,
}
fn default_group_cd() -> u8 {
0
}
fn default_group_user_cd() -> u8 {
0
}
impl GroupConfigOption {
pub fn cd(&self) -> u8 {
self.cd
}
pub fn user_cd(&self) -> u8 {
self.user_cd
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GroupConfig {
#[serde(default)]
global: GroupConfigOption,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
group: HashMap<String, GroupConfigOption>,
}
impl Default for GroupConfigOption {
fn default() -> Self {
Self { cd: default_group_cd(), user_cd: default_group_user_cd() }
}
}
impl GroupConfig {
pub fn get() -> Self {
GROUP_CONFIG.read().unwrap().clone()
}
pub fn group(&self, group_id: &str) -> GroupConfigOption {
let config = GROUP_CONFIG.read().unwrap();
config.group.get(group_id).cloned().unwrap_or_default()
}
pub fn groups(&self) -> Vec<GroupConfigOption> {
let config = GROUP_CONFIG.read().unwrap();
config.group.values().cloned().collect()
}
pub fn global(&self) -> GroupConfigOption {
let config = GROUP_CONFIG.read().unwrap();
config.global.clone()
}
}