You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

112 lines
2.5 KiB

use std::borrow::Cow;
use std::fmt::Debug;
pub(crate) trait Shell: Debug {
fn currently_supported(&self) -> bool;
fn name(&self) -> &'static str;
fn binary_name(&self) -> &'static str;
fn shell_escape(str: &str) -> Cow<str>;
fn launch_args(&self) -> &'static [&'static str] {
&[]
}
}
#[derive(Debug)]
pub(crate) struct Fish;
impl Shell for Fish {
fn currently_supported(&self) -> bool {
cfg!(not(windows))
}
fn name(&self) -> &'static str {
"fish"
}
fn binary_name(&self) -> &'static str {
"fish"
}
fn shell_escape(str: &str) -> Cow<str> {
shell_escape::unix::escape(Cow::from(str))
}
}
#[derive(Debug)]
pub(crate) struct Bash;
impl Shell for Bash {
fn currently_supported(&self) -> bool {
true
}
fn name(&self) -> &'static str {
"bash"
}
fn binary_name(&self) -> &'static str {
"bash"
}
fn shell_escape(str: &str) -> Cow<str> {
shell_escape::unix::escape(Cow::from(str))
}
}
#[derive(Debug)]
pub(crate) struct Zsh;
impl Shell for Zsh {
fn currently_supported(&self) -> bool {
cfg!(not(windows))
}
fn name(&self) -> &'static str {
"zsh"
}
fn binary_name(&self) -> &'static str {
"zsh"
}
fn shell_escape(str: &str) -> Cow<str> {
shell_escape::unix::escape(Cow::from(str))
}
}
#[derive(Debug)]
pub(crate) struct WinCmd;
impl Shell for WinCmd {
fn currently_supported(&self) -> bool {
cfg!(windows)
}
fn name(&self) -> &'static str {
"win_cmd"
}
fn binary_name(&self) -> &'static str {
"cmd"
}
fn shell_escape(str: &str) -> Cow<str> {
Cow::from(
str.replace('\r', "")
.replace('\n', "^\n\n")
.replace('%', "%%")
.replace('|', "^|")
.replace('(', "^(")
.replace(')', "^)"),
)
}
}
#[derive(Debug)]
pub(crate) struct PowerShell;
impl Shell for PowerShell {
fn currently_supported(&self) -> bool {
true
}
fn name(&self) -> &'static str {
"powershell"
}
fn binary_name(&self) -> &'static str {
if cfg!(windows) {
"powershell"
} else {
"pwsh"
}
}
fn shell_escape(str: &str) -> Cow<str> {
let new_str = format!("'{}'", str.replace('\'', "''"));
Cow::from(new_str)
}
fn launch_args(&self) -> &'static [&'static str] {
&["-NoProfile"]
}
}