use std::env; use std::path::PathBuf; pub struct Configuration { // Default Base Directories, default to XDG dirs but can be pub output_directory: PathBuf, } impl Configuration { pub fn new() -> Self { let output_directory = Configuration::directory( "PAGE_OUTPUT_DIRECTORY", "XDG_CACHE_HOME", ".cache", "page" ); Configuration { output_directory, } } fn directory(user_override: &str, default_value: &str, home_fallback: &str, path: &str) -> PathBuf { match env::var(user_override) { Ok(directory) => PathBuf::from(directory), Err(_) => match env::var(default_value) { Ok(directory) => PathBuf::from(directory), Err(_) => match env::var("HOME") { Ok(directory) => PathBuf::from(directory).join(home_fallback), Err(_) => panic!("Could not find required directory, {} or {} should be set and readable.", user_override, default_value), }, }, }.join(path) } }