use crate::types::{AdapterConfig, ListConfig, PluginConfig, ServerConfig};
use puniyu_common::read_config;
use puniyu_path::config_dir;
use serde::{Deserialize, Serialize};
use smol_str::SmolStr;
use std::path::PathBuf;
use std::sync::LazyLock;
static CONFIG_PATH: LazyLock<PathBuf> = LazyLock::new(|| config_dir().join("core.toml"));
fn default_master() -> Vec<SmolStr> {
vec![SmolStr::new("console")]
}
fn default_prefix() -> Option<SmolStr> {
Some(SmolStr::new("!"))
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppConfig {
#[serde(default)]
server: ServerConfig,
#[serde(default)]
adapter: AdapterConfig,
#[serde(default)]
plugin: PluginConfig,
#[serde(default)]
group: ListConfig,
#[serde(default)]
friend: ListConfig,
#[serde(default = "default_master")]
masters: Vec<SmolStr>,
#[serde(default = "default_prefix")]
prefix: Option<SmolStr>,
}
impl Default for AppConfig {
#[inline]
fn default() -> Self {
Self {
server: Default::default(),
adapter: Default::default(),
plugin: Default::default(),
masters: default_master(),
prefix: default_prefix(),
group: Default::default(),
friend: Default::default(),
}
}
}
impl AppConfig {
pub fn get() -> Self {
use crate::ConfigRegistry;
ConfigRegistry::get(CONFIG_PATH.as_path()).and_then(|v| v.try_into().ok()).unwrap_or_else(
|| read_config::<Self>(config_dir().as_path(), "core").unwrap_or_default(),
)
}
pub fn server(&self) -> &ServerConfig {
&self.server
}
pub fn adapter(&self) -> &AdapterConfig {
&self.adapter
}
pub fn plugin(&self) -> &PluginConfig {
&self.plugin
}
pub fn group(&self) -> &ListConfig {
&self.group
}
pub fn friend(&self) -> &ListConfig {
&self.friend
}
pub fn masters(&self) -> Vec<&str> {
self.masters.iter().map(|s| s.as_str()).collect()
}
pub fn prefix(&self) -> Option<&str> {
self.prefix.as_deref()
}
}
impl crate::Config for AppConfig {
fn name(&self) -> &str {
"core"
}
fn to_value(&self) -> toml::Value {
crate::serialize_to_value(self)
}
}