use anyhow::Result;
use config::{Config, Environment, File};
use directories::ProjectDirs;
use serde::Deserialize;
#[derive(Debug, Deserialize, Default)]
pub struct Settings {
pub threads: Option<u8>,
pub rate_limit: Option<u32>,
pub default_dir: Option<String>,
pub concurrent_files: Option<usize>,
}
impl Settings {
pub fn load() -> Result<Self> {
let mut s = Config::builder();
if let Some(proj_dirs) = ProjectDirs::from("com", "parallel_downloader", "pd") {
let config_dir = proj_dirs.config_dir();
let config_path = config_dir.join("config.toml");
if config_path.exists() {
s = s.add_source(File::from(config_path));
}
};
s = s.add_source(Environment::with_prefix("PD").separator("__"));
match s.build() {
Ok(config) => Ok(config.try_deserialize().unwrap_or_default()),
Err(_) => Ok(Self::default()),
}
}
}