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.
55 lines
1.7 KiB
55 lines
1.7 KiB
use super::expression::Expression; |
|
use super::shell::*; |
|
use std::fmt::Write; |
|
use std::marker::PhantomData; |
|
|
|
#[derive(Debug)] |
|
pub(crate) struct SubShell<S: Shell, Exp: Expression<S>> { |
|
_s: PhantomData<S>, |
|
expression: Exp, |
|
} |
|
|
|
impl<S: Shell, Exp: Expression<S>> SubShell<S, Exp> { |
|
pub(crate) fn new(expression: Exp) -> Self { |
|
Self { |
|
_s: PhantomData, |
|
expression, |
|
} |
|
} |
|
} |
|
|
|
impl<E: Expression<Zsh>> Expression<Zsh> for SubShell<Zsh, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut s = String::new(); |
|
self.expression.write_shell(&mut s)?; |
|
write!(writer, r#"echo {} | zsh"#, Zsh::shell_escape(&s)) |
|
} |
|
} |
|
|
|
impl<E: Expression<Bash>> Expression<Bash> for SubShell<Bash, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut s = String::new(); |
|
self.expression.write_shell(&mut s)?; |
|
write!(writer, r#"echo {} | bash"#, Bash::shell_escape(&s)) |
|
} |
|
} |
|
|
|
impl<E: Expression<Fish>> Expression<Fish> for SubShell<Fish, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut s = String::new(); |
|
self.expression.write_shell(&mut s)?; |
|
write!(writer, r#"fish -c {}"#, Fish::shell_escape(&s)) |
|
} |
|
} |
|
|
|
impl<E: Expression<PowerShell>> Expression<PowerShell> for SubShell<PowerShell, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut s = String::new(); |
|
self.expression.write_shell(&mut s)?; |
|
write!( |
|
writer, |
|
r#"echo {} | powershell -NoProfile"#, |
|
PowerShell::shell_escape(&s) |
|
) |
|
} |
|
}
|
|
|