use config::{Config, ConfigError}; use serde::Deserialize; use std::env::current_dir; #[derive(Debug, Deserialize)] //#[allow(unused)] pub struct Settings { pub address: String, pub port: u16, pub data_dir: String, } impl Settings { pub fn new() -> Result { let working_dir = current_dir().unwrap(); let data_dir = working_dir.to_str().unwrap(); let s = Config::builder() .set_default("port", 9090)? .set_default("address", "127.0.0.1")? .set_default("data_dir", data_dir)? .add_source(config::File::with_name("morethantext").required(false)) .add_source( config::Environment::with_prefix("MTT") .try_parsing(true) .separator("_") .list_separator(" "), ) .build()?; s.try_deserialize() } } #[cfg(test)] mod settings_tests { use super::*; use serial_test::serial; #[test] #[serial] fn defaults() { let set = Settings::new().unwrap(); let working_dir = current_dir().unwrap(); let data_dir = working_dir.to_str().unwrap(); println!("{:?}", set); assert_eq!(set.port, 9090); assert_eq!(set.address, "127.0.0.1"); assert_eq!(set.data_dir, data_dir); } #[test] #[serial] fn port_env() { std::env::set_var("MTT_PORT", "7825"); let set = Settings::new().unwrap(); println!("{:?}", set); assert_eq!(set.port, 7825); std::env::remove_var("MTT_PORT"); } }