use crate::config::core::{AppConfig, Environment, GlobalConfig, LogLevel, LoggingConfig};
use crate::error::QuickDbError;
use crate::types::*;
use rat_logger::info;
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug)]
pub struct GlobalConfigBuilder {
databases: HashMap<String, DatabaseConfig>,
default_database: Option<String>,
app: Option<AppConfig>,
logging: Option<LoggingConfig>,
}
impl GlobalConfigBuilder {
pub fn new() -> Self {
Self {
databases: HashMap::new(),
default_database: None,
app: None,
logging: None,
}
}
pub fn add_database(mut self, config: DatabaseConfig) -> Self {
let alias = config.alias.clone();
self.databases.insert(alias, config);
self
}
pub fn default_database<S: Into<String>>(mut self, alias: S) -> Self {
self.default_database = Some(alias.into());
self
}
pub fn app(mut self, app: AppConfig) -> Self {
self.app = Some(app);
self
}
pub fn logging(mut self, logging: LoggingConfig) -> Self {
self.logging = Some(logging);
self
}
pub fn build(self) -> Result<GlobalConfig, QuickDbError> {
if self.databases.is_empty() {
return Err(crate::quick_error!(config, "至少需要配置一个数据库"));
}
let app = self
.app
.ok_or_else(|| crate::quick_error!(config, "应用配置必须设置"))?;
let logging = self
.logging
.ok_or_else(|| crate::quick_error!(config, "日志配置必须设置"))?;
if let Some(ref default_alias) = self.default_database {
if !self.databases.contains_key(default_alias) {
return Err(crate::quick_error!(
config,
format!("默认数据库 '{}' 不存在于数据库配置中", default_alias)
));
}
}
info!(
"创建全局配置: 数据库数量={}, 默认数据库={:?}",
self.databases.len(),
self.default_database
);
Ok(GlobalConfig {
databases: self.databases,
default_database: self.default_database,
app,
logging,
})
}
}
impl Default for GlobalConfigBuilder {
fn default() -> Self {
Self::new()
}
}