use std::path::PathBuf;
pub fn resolve_shell_command(
command_path: &Option<String>,
default_command: &str,
) -> anyhow::Result<PathBuf> {
let Some(explicit) = command_path else {
return which::which(default_command)
.map_err(|_| anyhow::anyhow!("'{default_command}' not found on PATH"));
};
let p = PathBuf::from(explicit);
if p.exists() {
return Ok(p);
}
let looks_like_path = if cfg!(windows) {
explicit.contains('\\') || explicit.contains('/')
} else {
explicit.contains('/')
};
if looks_like_path {
anyhow::bail!("explicit path '{}' does not exist", p.display());
}
let result = which::which(explicit);
#[cfg(windows)]
{
if let Ok(ref path) = result {
if !path.to_string_lossy().to_lowercase().ends_with(".exe") {
let exe_name = format!("{}.exe", explicit);
if let Ok(exe_path) = which::which(&exe_name) {
return Ok(exe_path);
}
}
}
}
result.map_err(|_| {
anyhow::anyhow!(
"command '{explicit}' not found on PATH (explicit path did not exist either)"
)
})
}