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.
113 lines
2.5 KiB
113 lines
2.5 KiB
![]()
4 years ago
|
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"]
|
||
|
}
|
||
|
}
|