use crate::command::{InputPolicy, OutputPolicy};
use crate::runner::OutputObserver;
use super::size::PtySize;
#[derive(Clone, Default)]
pub struct PtyIo {
pub input: InputPolicy,
pub output: OutputPolicy,
pub observer: OutputObserver,
pub size: PtySize,
}
impl std::fmt::Debug for PtyIo {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("PtyIo")
.field("input", &self.input)
.field("output", &self.output)
.field("observer", &self.observer)
.field("size", &self.size)
.finish()
}
}
impl PtyIo {
#[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
}
#[must_use]
pub fn with_size(mut self, size: PtySize) -> Self {
self.size = size;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builders_update_fields() {
let io = PtyIo::new(OutputObserver::new())
.with_input(InputPolicy::Bytes(b"y\n".to_vec()))
.with_output(OutputPolicy::observe_only())
.with_size(PtySize::new(50, 200));
assert_eq!(io.input, InputPolicy::Bytes(b"y\n".to_vec()));
assert!(!io.output.capture_stdout);
assert_eq!(io.size, PtySize::new(50, 200));
}
#[test]
fn debug_reports_observer_presence() {
let io = PtyIo::new(OutputObserver::new().with_stdout_bytes(|_| {}));
let rendered = format!("{io:?}");
assert!(rendered.contains("PtyIo"));
assert!(rendered.contains("stdout_bytes: true"));
}
}