#[cfg(unix)]
use crate::pty::PtyIo;
use crate::runner::OutputObserver;
pub const DEFAULT_MAX_OUTPUT_BYTES: usize = 1024 * 1024;
#[derive(Debug, Clone, Eq, PartialEq, Default)]
#[non_exhaustive]
pub enum InputPolicy {
#[default]
Closed,
Bytes(Vec<u8>),
Inherit,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct OutputPolicy {
pub capture_stdout: bool,
pub capture_stderr: bool,
pub max_output_bytes: Option<usize>,
}
impl Default for OutputPolicy {
fn default() -> Self {
Self::captured()
}
}
impl OutputPolicy {
#[must_use]
pub const fn captured() -> Self {
Self {
capture_stdout: true,
capture_stderr: true,
max_output_bytes: Some(DEFAULT_MAX_OUTPUT_BYTES),
}
}
#[must_use]
pub const fn observe_only() -> Self {
Self {
capture_stdout: false,
capture_stderr: false,
max_output_bytes: Some(DEFAULT_MAX_OUTPUT_BYTES),
}
}
#[must_use]
pub fn with_max_output_bytes(mut self, bytes: usize) -> Self {
self.max_output_bytes = Some(bytes);
self
}
#[must_use]
pub fn with_unbounded_output(mut self) -> Self {
self.max_output_bytes = None;
self
}
}
#[derive(Debug, Clone, Eq, PartialEq, Default)]
pub struct CapturedIo {
pub input: InputPolicy,
pub output: OutputPolicy,
}
impl CapturedIo {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_input(mut self, input: InputPolicy) -> Self {
self.input = input;
self
}
#[must_use]
pub fn with_output(mut self, output: OutputPolicy) -> Self {
self.output = output;
self
}
}
#[derive(Debug, Clone, Default)]
pub struct ObservedIo {
pub input: InputPolicy,
pub output: OutputPolicy,
pub observer: OutputObserver,
}
impl ObservedIo {
#[must_use]
pub fn new(observer: OutputObserver) -> Self {
Self {
observer,
..Self::default()
}
}
#[must_use]
pub fn with_input(mut self, input: InputPolicy) -> Self {
self.input = input;
self
}
#[must_use]
pub fn with_output(mut self, output: OutputPolicy) -> Self {
self.output = output;
self
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct InheritedIo {
pub input: InputPolicy,
}
impl Default for InheritedIo {
fn default() -> Self {
Self {
input: InputPolicy::Inherit,
}
}
}
impl InheritedIo {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_input(mut self, input: InputPolicy) -> Self {
self.input = input;
self
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum ProcessIo {
Captured(CapturedIo),
Observed(ObservedIo),
Inherited(InheritedIo),
#[cfg(unix)]
Pty(PtyIo),
}
impl Default for ProcessIo {
fn default() -> Self {
Self::Captured(CapturedIo::default())
}
}
impl ProcessIo {
#[must_use]
pub fn captured(io: CapturedIo) -> Self {
Self::Captured(io)
}
#[must_use]
pub fn observed(io: ObservedIo) -> Self {
Self::Observed(io)
}
#[must_use]
pub fn inherited(io: InheritedIo) -> Self {
Self::Inherited(io)
}
#[cfg(unix)]
#[must_use]
pub fn pty(io: PtyIo) -> Self {
Self::Pty(io)
}
}