#[must_use]
pub fn expand_tilde_with_home(s: &str, home: Option<&str>) -> String {
if let Some(rest) = s.strip_prefix("~/") {
if let Some(h) = home {
return format!("{h}/{rest}");
}
}
s.to_string()
}
#[must_use]
pub fn expand_tilde(s: &str) -> String {
let home = std::env::var("HOME").ok();
expand_tilde_with_home(s, home.as_deref())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn expand_tilde_with_home_set_replaces_prefix() {
assert_eq!(
expand_tilde_with_home("~/notes/x", Some("/tmp/fake-home")),
"/tmp/fake-home/notes/x"
);
}
#[test]
fn expand_tilde_passes_through_paths_without_prefix() {
assert_eq!(expand_tilde_with_home("/abs", Some("/h")), "/abs");
assert_eq!(expand_tilde_with_home("rel", Some("/h")), "rel");
assert_eq!(expand_tilde_with_home("~", Some("/h")), "~");
}
#[test]
fn expand_tilde_returns_input_when_home_missing() {
assert_eq!(
expand_tilde_with_home("~/something", None),
"~/something"
);
}
#[test]
fn expand_tilde_env_wrapper_runs_without_panicking() {
let _ = expand_tilde("~/x");
let _ = expand_tilde("/abs");
}
}