use std::path::{Path, PathBuf};
pub(crate) fn expand_tilde<P: AsRef<Path>>(path_user_input: P) -> Option<PathBuf> {
let path = path_user_input.as_ref();
if !path.starts_with("~") {
return Some(path.to_path_buf());
}
if path == Path::new("~") {
return dirs::home_dir();
}
dirs::home_dir().map(|mut home| {
if home == Path::new("/") {
path.strip_prefix("~").unwrap_or(path).to_path_buf()
} else {
home.push(path.strip_prefix("~").unwrap_or(path));
home
}
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_expand_tilde() {
let home = std::env::var("HOME").unwrap();
assert_eq!(
expand_tilde("~/dummy").unwrap(),
PathBuf::from(format!("{home}/dummy"))
);
assert_eq!(
expand_tilde("/root/dummy").unwrap(),
PathBuf::from("/root/dummy")
);
}
}