use config::{File, Map};
use serde::{Deserialize, Serialize};
use tracing::{debug, trace};
#[derive(Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct Config {
pub root: String,
pub user: Vec<String>,
pub directories: Vec<String>,
pub custom_directories: Map<String, String>,
pub device: String,
}
impl Default for Config {
fn default() -> Self {
Self {
root: "/mnt/backup".to_string(),
user: vec![],
directories: vec![],
custom_directories: Map::new(),
device: gethostname::gethostname()
.into_string()
.expect("invalid hostname string"),
}
}
}
impl Config {
pub fn load() -> Result<Self, config::ConfigError> {
debug!("load config");
let config = config::Config::builder()
.add_source(File::with_name("config.toml").required(false))
.add_source(config::Environment::with_prefix("FXBAUP").separator("_"))
.build()?;
let cfg = config.try_deserialize();
trace!(?cfg, "loaded config");
cfg
}
}