diff --git a/src/config.rs b/src/config.rs index 33914a4..f9f4dce 100644 --- a/src/config.rs +++ b/src/config.rs @@ -57,31 +57,48 @@ pub struct PageMeta { pub fn get_path(xdg: &str) -> Result { let dir: String; - - if unsafe { libc::geteuid() } == 0 { - dir = match xdg { - "XDG_CACHE_HOME" => "/var".to_owned(), - "XDG_CONFIG_HOME" => "/etc".to_owned(), - _ => panic!("nya"), - }; - } else { - dir = match env::var(xdg) { - Ok(var) => var, - Err(_) => { - match env::var("HOME") { - Ok(home) => format!("{}/.config", home), - Err(_) => { - return Err(( - "Unable to determine path to current user’s home directory." - .to_string(), - EX_UNAVAILABLE - )); - }, - } - }, - }; - } + let home_dir = match env::var("HOME").ok() { + Some(home) => home, + None => { + return Err(( + "Unable to determine path to current user’s home directory." + .to_string(), + EX_UNAVAILABLE + )); + } + }; + let mut root = false; + if unsafe { libc::geteuid() } == 0 { root = true; } + + dir = match (root, env::var(xdg).ok()) { + (false, Some(var)) => var, + (su, None) => { + match xdg { + "XDG_CACHE_HOME" => { + if su { "/var".to_owned() } + else { format!("{}/.cache", home_dir) } + }, + "XDG_CONFIG_HOME" => { + if su { "/etc".to_owned() } + else { format!("{}/.config", home_dir) } + }, + "XDG_DATA_HOME" => { + if su { "/usr/share".to_owned() } + else { format!("{}/.local/share", home_dir) } + }, + _ => { + return Err( + (format!("{}: Unimplemented variable.", xdg), EX_SOFTWARE) + ); + }, + } + }, + _ => { + panic!("nya"); + }, + }; + Ok(format!("{}/plaque", dir)) }