use anyhow::{Context, Result};
use std::path::PathBuf;
pub fn spm_home() -> Result<PathBuf> {
if let Ok(custom) = std::env::var("SPM_HOME") {
return Ok(PathBuf::from(custom));
}
let base = directories::BaseDirs::new().context("could not determine home directory")?;
Ok(base.home_dir().join(".spm"))
}
pub fn store_dir() -> Result<PathBuf> {
Ok(spm_home()?.join("store"))
}
pub fn vendors_dir() -> Result<PathBuf> {
Ok(spm_home()?.join("vendors"))
}
pub fn vendor_project_dir(vendor: &str, project_root: &std::path::Path) -> Result<PathBuf> {
let key: String = project_root
.to_string_lossy()
.chars()
.map(|c| if c.is_ascii_alphanumeric() { c } else { '_' })
.collect();
Ok(vendors_dir()?.join(vendor).join(key.trim_matches('_')))
}