mod app;
#[doc(inline)]
pub use app::AppConfig;
mod bot;
#[doc(inline)]
pub use bot::BotConfig;
mod friend;
#[doc(inline)]
pub use friend::FriendConfig;
mod group;
#[doc(inline)]
pub use group::GroupConfig;
mod types;
#[doc(inline)]
pub use types::*;
mod common;
mod config;
mod registry;
pub use registry::ConfigRegistry;
use puniyu_path::{config_dir, log_dir};
pub trait Config: Send + Sync {
fn name(&self) -> &str;
fn path(&self) -> std::path::PathBuf {
puniyu_path::config_dir()
}
fn to_value(&self) -> toml::Value;
}
impl PartialEq for dyn Config {
fn eq(&self, other: &Self) -> bool {
self.name() == other.name() && self.path() == other.path()
}
}
pub(crate) fn serialize_to_value<T: serde::Serialize>(config: &T) -> toml::Value {
toml::Value::try_from(config).expect("Failed to serialize config to toml::Value")
}
#[inline]
pub fn app_config() -> AppConfig {
AppConfig::get()
}
#[inline]
pub fn bot_config() -> BotConfig {
BotConfig::get()
}
#[inline]
pub fn friend_config() -> FriendConfig {
FriendConfig::get()
}
#[inline]
pub fn group_config() -> GroupConfig {
GroupConfig::get()
}
pub fn init() {
macro_rules! core_debug {
($($arg:tt)+) => {{
use ::puniyu_logger::owo_colors::OwoColorize;
let prefix = "Core".fg_rgb::<64, 224, 208>();
::log::debug!("[{}] {}", prefix, format_args!($($arg)+))
}};
}
macro_rules! core_error {
($($arg:tt)+) => {{
use ::puniyu_logger::owo_colors::OwoColorize;
let prefix = "Core".fg_rgb::<64, 224, 208>();
::log::error!("[{}] {}", prefix, format_args!($($arg)+))
}};
}
if !config_dir().as_path().exists() {
std::fs::create_dir_all(config_dir().as_path())
.unwrap_or_else(|_| core_error!("[Config] Failed to initialize config directory"));
}
if !log_dir().as_path().exists() {
std::fs::create_dir_all(log_dir().as_path())
.unwrap_or_else(|_| core_error!("[Config] Failed to initialize log directory"));
}
macro_rules! register_config {
($config:expr) => {{
let cfg = $config;
if let Err(e) = ConfigRegistry::register(cfg) {
core_error!("[Config] Failed to register config: {}", e);
} else {
core_debug!("[Config] {} config registered", stringify!($config));
}
}};
}
register_config!(AppConfig::default());
register_config!(BotConfig::default());
register_config!(GroupConfig::default());
register_config!(FriendConfig::default());
config::start_config_watcher();
}