diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/config/role.rs | 12 | ||||
| -rw-r--r-- | src/utils/mod.rs | 53 |
2 files changed, 41 insertions, 24 deletions
diff --git a/src/config/role.rs b/src/config/role.rs index f963874..a63877b 100644 --- a/src/config/role.rs +++ b/src/config/role.rs @@ -23,18 +23,18 @@ pub struct Role { impl Role { pub fn for_execute() -> Self { let os = detect_os(); - let shell = detect_shell(); - let shell = match shell.rsplit_once('/') { - Some((_, v)) => v, - None => &shell, + let (shell, _, _) = detect_shell(); + let combine = match shell.as_str() { + "nushell" | "powershell" => ";", + _ => "&&", }; Self { name: "__for_execute__".into(), prompt: format!( r#"Provide only {shell} commands for {os} without any description. If there is a lack of details, provide most logical solution. -Ensure the output is a valid shell command. -If multiple steps required try to combine them together using &&. +Ensure the output is a valid {shell} command. +If multiple steps required try to combine them together using {combine}. Provide only plain text without Markdown formatting. Do not provide markdown formatting such as ```"# ), diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 7dacd5c..b59b7ad 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -103,33 +103,50 @@ pub fn detect_os() -> String { os.to_string() } -pub fn detect_shell() -> String { +pub fn detect_shell() -> (String, String, &'static str) { let os = env::consts::OS; if os == "windows" { - if let Some(true) = env::var("PSModulePath") - .ok() - .map(|v| v.split(';').count() >= 3) - { - "powershell.exe".into() + if env::var("NU_VERSION").is_ok() { + ("nushell".into(), "nu.exe".into(), "-c") + } else if let Some(ret) = env::var("PSModulePath").ok().and_then(|v| { + let v = v.to_lowercase(); + if v.split(';').count() >= 3 { + if v.contains("powershell\\7\\") { + Some(("pwsh".into(), "pwsh.exe".into(), "-c")) + } else { + Some(("powershell".into(), "powershell.exe".into(), "-Command")) + } + } else { + None + } + }) { + ret } else { - "cmd.exe".into() + ("cmd".into(), "cmd.exe".into(), "/C") } + } else if env::var("NU_VERSION").is_ok() { + ("nushell".into(), "nu".into(), "-c") } else { - env::var("SHELL").unwrap_or_else(|_| "/bin/sh".to_string()) + let shell_cmd = env::var("SHELL").unwrap_or_else(|_| "/bin/sh".to_string()); + let shell_name = match shell_cmd.rsplit_once('/') { + Some((_, name)) => name.to_string(), + None => shell_cmd.clone(), + }; + let shell_name = if shell_name == "nu" { + "nushell".into() + } else { + shell_name + }; + (shell_name, shell_cmd, "-c") } } pub fn run_command(eval_str: &str) -> anyhow::Result<i32> { - let shell = detect_shell(); - let mut command = Command::new(&shell); - if shell == "powershell.exe" { - command.arg("-Command").arg(eval_str); - } else if shell == "cmd.exe" { - command.arg("/c").arg(eval_str); - } else { - command.arg("-c").arg(eval_str); - }; - let status = command.status()?; + let (_shell_name, shell_cmd, shell_arg) = detect_shell(); + let status = Command::new(shell_cmd) + .arg(shell_arg) + .arg(eval_str) + .status()?; Ok(status.code().unwrap_or_default()) } |
