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
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"] |
|
} |
|
}
|
|
|