use std::path::PathBuf;
pub const ENV_EXPORT_BASE: &str = "DEVSHELL_EXPORT_BASE";
#[must_use]
pub fn devshell_export_parent_dir() -> PathBuf {
if let Ok(p) = std::env::var(ENV_EXPORT_BASE) {
let p = p.trim();
if !p.is_empty() {
return PathBuf::from(p);
}
}
#[cfg(unix)]
{
if let Ok(xdg) = std::env::var("XDG_CACHE_HOME") {
let xdg = xdg.trim();
if !xdg.is_empty() {
return PathBuf::from(xdg).join("cargo-devshell-exports");
}
}
if let Ok(home) = std::env::var("HOME") {
let home = home.trim();
if !home.is_empty() {
return PathBuf::from(home)
.join(".cache")
.join("cargo-devshell-exports");
}
}
}
#[cfg(windows)]
{
if let Ok(local) = std::env::var("LOCALAPPDATA") {
let local = local.trim();
if !local.is_empty() {
return PathBuf::from(local).join("cargo-devshell-exports");
}
}
}
std::env::temp_dir()
}
#[must_use]
pub fn find_in_path(program: &str) -> Option<PathBuf> {
let path_env = std::env::var_os("PATH")?;
let ext = if cfg!(windows) { ".exe" } else { "" };
for part in std::env::split_paths(&path_env) {
let candidate = part.join(format!("{program}{ext}"));
if candidate.is_file() {
return Some(candidate);
}
}
None
}