use crate::error::Error;
use std::path::{Path, PathBuf};
pub fn lpm_dir() -> Result<PathBuf, Error> {
Ok(dirs::home_dir().ok_or(Error::NoHomeDir)?.join(".lpm"))
}
pub fn bin_dir() -> Result<PathBuf, Error> {
Ok(lpm_dir()?.join("bin"))
}
pub fn tools_dir() -> Result<PathBuf, Error> {
Ok(lpm_dir()?.join("tools"))
}
pub fn global_tools_file() -> Result<PathBuf, Error> {
Ok(lpm_dir()?.join("tools.toml"))
}
pub fn credentials_file() -> Result<PathBuf, Error> {
Ok(lpm_dir()?.join("credentials.toml"))
}
pub fn index_cache_dir() -> Result<PathBuf, Error> {
Ok(lpm_dir()?.join("index-cache"))
}
pub fn same_file(a: &Path, b: &Path) -> bool {
match (a.canonicalize(), b.canonicalize()) {
(Ok(a), Ok(b)) => a == b,
_ => false,
}
}
pub fn with_suffix(path: &Path, suffix: &str) -> PathBuf {
let mut name = path.as_os_str().to_os_string();
name.push(suffix);
PathBuf::from(name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn everything_lives_under_dot_lpm() {
let Ok(root) = lpm_dir() else {
return;
};
assert!(root.ends_with(".lpm"));
for path in [
bin_dir().unwrap(),
tools_dir().unwrap(),
global_tools_file().unwrap(),
credentials_file().unwrap(),
index_cache_dir().unwrap(),
] {
assert!(path.starts_with(&root), "{} escaped ~/.lpm", path.display());
}
assert!(credentials_file().unwrap().ends_with("credentials.toml"));
}
#[test]
fn suffixes_the_last_component() {
assert_eq!(
with_suffix(Path::new("/tools/rojo/7.4.4"), ".tmp"),
PathBuf::from("/tools/rojo/7.4.4.tmp")
);
}
#[test]
fn missing_paths_are_never_the_same_file() {
assert!(!same_file(Path::new("/nope/a"), Path::new("/nope/a")));
}
}