use mofa_kernel::config::load_config;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::Path;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Config parse error: {0}")]
Parse(String),
#[error("Config field missing: {0}")]
FieldMissing(&'static str),
#[error("Invalid config value: {0}")]
InvalidValue(&'static str),
#[error("Unsupported config format: {0}")]
UnsupportedFormat(String),
}
pub struct ConfigLoader {
config: FrameworkConfig,
}
impl ConfigLoader {
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self, ConfigError> {
let path_str = path.as_ref().to_string_lossy().to_string();
let config = load_config(&path_str).map_err(|e| match e {
mofa_kernel::config::ConfigError::Io(e) => ConfigError::Io(e),
mofa_kernel::config::ConfigError::Parse(e) => ConfigError::Parse(e.to_string()),
mofa_kernel::config::ConfigError::Serialization(e) => ConfigError::Parse(e),
mofa_kernel::config::ConfigError::UnsupportedFormat(e) => {
ConfigError::UnsupportedFormat(e)
}
})?;
Ok(Self { config })
}
pub fn from_env() -> Result<Self, ConfigError> {
Ok(Self {
config: FrameworkConfig::default(),
})
}
pub fn config(&self) -> &FrameworkConfig {
&self.config
}
pub fn database_config(&self) -> &DatabaseConfig {
&self.config.database
}
pub fn cache_config(&self) -> &CacheConfig {
&self.config.cache
}
pub fn message_queue_config(&self) -> &MessageQueueConfig {
&self.config.message_queue
}
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct DatabaseConfig {
pub r#type: String,
pub url: String,
pub max_connections: Option<u32>,
pub connection_timeout: Option<u32>,
pub idle_timeout: Option<u32>,
pub extra: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct CacheConfig {
pub r#type: String,
pub servers: Vec<String>,
pub prefix: Option<String>,
pub default_ttl: Option<u32>,
pub max_size: Option<usize>,
pub extra: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct MessageQueueConfig {
pub r#type: String,
pub brokers: Vec<String>,
pub topic: Option<String>,
pub group_id: Option<String>,
pub extra: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct FrameworkConfig {
pub database: DatabaseConfig,
pub cache: CacheConfig,
pub message_queue: MessageQueueConfig,
pub framework_name: Option<String>,
pub framework_version: Option<String>,
pub environment: Option<String>,
}