use portable_pty::{CommandBuilder, NativePtySystem, PtySize, PtySystem};
use std::sync::mpsc::channel;
fn main() {
let pty_system = NativePtySystem::default();
let pair = pty_system
.openpty(PtySize {
rows: 24,
cols: 80,
pixel_width: 0,
pixel_height: 0,
})
.unwrap();
let mut args = std::env::args_os().skip(1);
let mut cmd = CommandBuilder::new(args.next().unwrap());
cmd.args(args);
let mut child = pair.slave.spawn_command(cmd).unwrap();
drop(pair.slave);
let (tx, rx) = channel();
let mut reader = pair.master.try_clone_reader().unwrap();
std::thread::spawn(move || {
let mut s = String::new();
reader.read_to_string(&mut s).unwrap();
tx.send(s).unwrap();
});
{
let mut writer = pair.master.take_writer().unwrap();
if cfg!(target_os = "macos") {
std::thread::sleep(std::time::Duration::from_millis(20));
}
let to_write = "";
if !to_write.is_empty() {
std::thread::spawn(move || {
writer.write_all(to_write.as_bytes()).unwrap();
});
}
}
eprintln!("child status: {:?}", child.wait().unwrap());
drop(pair.master);
let output = rx.recv().unwrap();
let output = output.replace("\r\n", "\n");
print!("{output}");
}