use anyhow::Context;
use kelpdot_macros::red;
use std::path::Path;
pub fn get_path_from_env<T: ToString>(var: &str, def: T) -> anyhow::Result<String> {
let mut base = std::env::var(var).unwrap_or_else(|_| def.to_string());
if !Path::new(&base).exists() {
base = def.to_string();
}
let full = std::fs::canonicalize(base)?;
Ok(full.to_str().unwrap().to_string())
}
#[cfg(test)]
mod tests {
#[test]
fn get_path_fenv_test() {
use super::get_path_from_env;
println!("{}", std::env::current_dir().unwrap().to_str().unwrap().to_string());
assert_eq!(std::env::current_dir().unwrap().to_str().unwrap().to_string(), get_path_from_env("SOME_USELESS_VAR", ".").unwrap())
}
}
pub fn get_root() -> anyhow::Result<String> {
get_path_from_env("DOTFILES_ROOT", ".")
}
pub fn get_ins_root() -> anyhow::Result<String> {
get_path_from_env("KELPDOT_INS_ROOT", "/")
}
pub fn get_to_make(path: String) -> anyhow::Result<String> {
let home = std::env::var("HOME").with_context(|| red!("Unable to get env var $HOME"))?;
if Path::new(&format!("{}/{}", home, path)).exists() {
Ok(Path::new(&path)
.parent()
.unwrap()
.to_str()
.unwrap()
.to_owned())
} else {
Ok(Path::new(&path)
.parent()
.unwrap()
.strip_prefix("/")? .to_str()
.unwrap()
.to_owned())
}
}