diff --git a/crates/util/src/paths.rs b/crates/util/src/paths.rs index 63c3c6d884..b04c12a204 100644 --- a/crates/util/src/paths.rs +++ b/crates/util/src/paths.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; lazy_static::lazy_static! { pub static ref HOME: PathBuf = dirs::home_dir().expect("failed to determine home directory"); @@ -23,3 +23,55 @@ pub mod legacy { pub static ref KEYMAP: PathBuf = CONFIG_DIR.join("keymap.json"); } } + +/// Compacts a given file path by replacing the user's home directory +/// prefix with a tilde (`~`). +/// +/// # Arguments +/// +/// * `path` - A reference to a `Path` representing the file path to compact. +/// +/// # Examples +/// +/// ``` +/// use std::path::{Path, PathBuf}; +/// use util::paths::compact; +/// let path: PathBuf = [ +/// util::paths::HOME.to_string_lossy().to_string(), +/// "some_file.txt".to_string(), +/// ] +/// .iter() +/// .collect(); +/// if cfg!(target_os = "linux") || cfg!(target_os = "macos") { +/// assert_eq!(compact(&path).to_str(), Some("~/some_file.txt")); +/// } else { +/// assert_eq!(compact(&path).to_str(), path.to_str()); +/// } +/// ``` +/// +/// # Returns +/// +/// * A `PathBuf` containing the compacted file path. If the input path +/// does not have the user's home directory prefix, or if we are not on +/// Linux or macOS, the original path is returned unchanged. +/// +/// # Errors +/// +/// This function will not produce any errors, but in case the input path +/// cannot be stripped of the home directory prefix, the original path +/// will be returned unchanged. +pub fn compact(path: &Path) -> PathBuf { + if cfg!(target_os = "linux") || cfg!(target_os = "macos") { + match path.strip_prefix(HOME.as_path()) { + Ok(relative_path) => { + let mut shortened_path = PathBuf::new(); + shortened_path.push("~"); + shortened_path.push(relative_path); + shortened_path + } + Err(_) => path.to_path_buf(), + } + } else { + path.to_path_buf() + } +}