tabby/crates/aim-downloader/src/untildify.rs

81 lines
2.2 KiB
Rust

//! Replace `~` with user home directory across all platforms
//!
//! Unit tests come from https://github.com/sathishsoundharajan/untildify (MIT LICENSE)
pub fn untildify(input_path: &str) -> String {
if input_path.is_empty() {
return String::from(input_path);
}
if let Some(home) = home::home_dir() {
if input_path == r"~" {
return home.into_os_string().into_string().unwrap();
}
if input_path.starts_with(r"~/") || input_path.starts_with(r"~\") {
if let Ok(path) = home.join(&input_path[2..]).into_os_string().into_string() {
return path;
}
}
}
String::from(input_path)
}
#[cfg(any(unix, target_os = "redox"))]
#[cfg(test)]
mod tests {
use std::{env, path::Path};
use super::*;
#[test]
fn test_returns_untildfyed_string() {
env::remove_var("HOME");
let home = Path::new("/User/Untildify");
env::set_var("HOME", home.as_os_str());
assert_eq!(untildify("~/Desktop"), "/User/Untildify/Desktop");
assert_eq!(untildify("~/a/b/c/d/e"), "/User/Untildify/a/b/c/d/e");
assert_eq!(untildify("~/"), "/User/Untildify/");
}
#[test]
fn test_returns_empty_string() {
env::remove_var("HOME");
let home = Path::new("/User/Untildify");
env::set_var("HOME", home.as_os_str());
assert_eq!(untildify("Desktop"), "Desktop");
assert_eq!(untildify(""), "");
assert_eq!(untildify("/"), "/");
// assert_eq!(untildify("~/Desktop/~/Code"), "/User/Untildify/Desktop/");
}
#[test]
fn test_with_dot_folders() {
env::remove_var("HOME");
let home = Path::new("/User/Untildify");
env::set_var("HOME", home.as_os_str());
assert_eq!(untildify("~/.ssh/id_rsa"), "/User/Untildify/.ssh/id_rsa");
}
}
#[cfg(target_os = "windows")]
#[cfg(test)]
mod tests {
use std::env;
use super::*;
#[test]
fn test_returns_untildfyed_string() {
env::set_var("USERPROFILE", r"C:\Users\Admin");
assert_eq!(untildify(r"~\Desktop"), r"C:\Users\Admin\Desktop");
assert_eq!(untildify(r"~\a\b\c\d\e"), r"C:\Users\Admin\a\b\c\d\e");
assert_eq!(untildify(r"~\"), r"C:\Users\Admin\");
}
}