use crate::{Capture, Command, Result, SendStdin};
use tokio_codec::{Decoder, Encoder, FramedRead, FramedWrite};
use tokio_process::{ChildStderr, ChildStdin, ChildStdout};
pub trait Control: Sized {
fn command(&self) -> &Command;
fn id(&self) -> u32;
fn kill(&mut self) -> Result<()>;
}
pub trait StandardInput<'a>: Control + 'a {
fn standard_input(&mut self) -> &mut ChildStdin;
#[inline]
fn framed_stdin<E, Item>(&mut self, encoder: E) -> FramedWrite<&mut ChildStdin, E>
where
E: Encoder<Item = Item>,
{
FramedWrite::new(self.standard_input(), encoder)
}
#[inline]
fn send_stdin<E, Item>(self, encoder: E) -> SendStdin<'a, Self, E, Item>
where
E: Encoder<Item = Item>,
{
SendStdin::new(self, encoder)
}
}
pub trait StandardOutput<'a>: Control + 'a {
fn standard_output(&mut self) -> &mut ChildStdout;
#[inline]
fn framed_stdout<D, Item>(&mut self, decoder: D) -> FramedRead<&mut ChildStdout, D>
where
D: Decoder<Item = Item>,
{
FramedRead::new(self.standard_output(), decoder)
}
#[inline]
fn capture_stdout<D, Item>(self, decoder: D) -> Capture<'a, Self, D, ChildStdout, Item>
where
D: Decoder<Item = Item>,
{
Capture::new_stdout(self, decoder)
}
}
pub trait StandardError<'a>: Control + 'a {
fn standard_error(&mut self) -> &mut ChildStderr;
#[inline]
fn framed_stderr<D, Item>(&mut self, decoder: D) -> FramedRead<&mut ChildStderr, D>
where
D: Decoder<Item = Item>,
{
FramedRead::new(self.standard_error(), decoder)
}
#[inline]
fn capture_stderr<D, Item>(self, decoder: D) -> Capture<'a, Self, D, ChildStderr, Item>
where
D: Decoder<Item = Item>,
{
Capture::new_stderr(self, decoder)
}
}