use crate::config::legacy::Config as CliConfig;
use crate::errors::prelude::Result as CliResult;
use std::path::Path;
use vkteams_bot::config::unified::UnifiedConfig;
pub struct UnifiedConfigAdapter;
impl UnifiedConfigAdapter {
pub fn load() -> CliResult<CliConfig> {
if let Ok(unified_config) = Self::load_unified_config() {
return Ok(Self::convert_from_unified(unified_config));
}
CliConfig::load()
}
pub fn load_from_path(path: &Path) -> CliResult<CliConfig> {
if Self::is_unified_config_path(path) {
if let Ok(unified_config) = Self::load_unified_config_from_path(path) {
Ok(Self::convert_from_unified(unified_config))
} else {
CliConfig::from_path(path)
}
} else {
CliConfig::from_path(path)
}
}
fn load_unified_config() -> Result<UnifiedConfig, Box<dyn std::error::Error>> {
let unified_paths = vec![
"./shared-config.toml",
"./config/config.toml",
"/app/config/config.toml",
];
for path in unified_paths {
if Path::new(path).exists() {
return Self::load_unified_config_from_path(Path::new(path));
}
}
Err("No unified config file found".into())
}
fn load_unified_config_from_path(
path: &Path,
) -> Result<UnifiedConfig, Box<dyn std::error::Error>> {
let content = std::fs::read_to_string(path)?;
let config: UnifiedConfig = toml::from_str(&content)?;
Ok(config)
}
fn convert_from_unified(unified: UnifiedConfig) -> CliConfig {
CliConfig {
api: crate::config::legacy::ApiConfig {
token: unified.api.token,
url: Some(unified.api.url),
timeout: unified.api.timeout,
max_retries: unified.api.max_retries,
},
files: crate::config::legacy::FileConfig {
download_dir: unified
.cli
.files
.download_dir
.map(|p| p.to_string_lossy().to_string()),
upload_dir: unified
.cli
.files
.upload_dir
.map(|p| p.to_string_lossy().to_string()),
max_file_size: unified.cli.files.max_file_size,
buffer_size: 8192, },
logging: crate::config::legacy::LoggingConfig {
level: unified.cli.logging.level,
format: unified.cli.logging.format,
colors: unified.cli.ui.colored_output, },
ui: crate::config::legacy::UiConfig {
show_progress: unified.cli.ui.show_progress,
progress_style: "bar".to_string(), progress_refresh_rate: 10, },
proxy: None, rate_limit: crate::config::legacy::RateLimitConfig::default(),
}
}
pub fn convert_to_unified(_cli_config: CliConfig) -> UnifiedConfig {
UnifiedConfig::default()
}
fn is_unified_config_path(path: &Path) -> bool {
if let Some(file_name) = path.file_name().and_then(|n| n.to_str()) {
matches!(file_name, "shared-config.toml" | "config.toml")
} else {
false
}
}
}