use std::path::Path;
use crate::domain::shell::Shell;
pub(crate) fn detect_shell() -> Option<Shell> {
if let Ok(sh) = std::env::var("SHELL") {
let base = Path::new(&sh)
.file_name()
.and_then(|n| n.to_str())
.unwrap_or("");
if let Ok(s) = base.parse::<Shell>() {
return Some(s);
}
}
if std::env::var("PSModulePath").is_ok() {
return Some(Shell::Pwsh);
}
None
}
pub(crate) fn resolve_shell(shell_flag: Option<&str>) -> Result<Option<Shell>, Box<dyn std::error::Error>> {
if let Some(s) = shell_flag {
let sh = s.parse::<Shell>().map_err(|e: crate::domain::shell::ShellParseError| {
Box::<dyn std::error::Error>::from(e.to_string())
})?;
return Ok(Some(sh));
}
Ok(detect_shell())
}