use anyhow::anyhow;
use futures::prelude::*;
use portable_pty::{native_pty_system, CommandBuilder, PtySize};
fn main() -> anyhow::Result<()> {
smol::block_on(async {
let pty_system = native_pty_system();
let pair = pty_system.openpty(PtySize {
rows: 24,
cols: 80,
pixel_width: 0,
pixel_height: 0,
})?;
let cmd = CommandBuilder::new("whoami");
let slave = pair.slave;
let mut child = smol::unblock(move || slave.spawn_command(cmd)).await?;
let reader = pair.master.try_clone_reader()?;
drop(pair.master);
let mut lines =
smol::io::BufReader::new(smol::Unblock::new(reader)).lines();
while let Some(line) = lines.next().await {
let line = line.map_err(|e| anyhow!("problem reading line: {}", e))?;
print!("output: len={} ", line.len());
for c in line.escape_debug() {
print!("{}", c);
}
println!();
}
println!(
"child status: {:?}",
smol::unblock(move || child
.wait()
.map_err(|e| anyhow!("waiting for child: {}", e)))
.await?
);
Ok(())
})
}