2 个不稳定版本
0.2.0 | 2019年10月27日 |
---|---|
0.1.0 | 2019年10月24日 |
1226 在 异步
44 每月下载量
在 teleterm 中使用
25KB
398 行
tokio-pty-process-stream
这个包封装了 tokio-pty-process
,以便提供一个更简单的 API,作为一个单个流对象。
概述
当您需要将交互式程序作为异步应用程序的一部分进行交互时,确定不同部分的结构可能很棘手。此包简化了 API,只提供通过 AsyncRead
对象输入,然后通过流生成的结果获取程序更新的信息。
概要
这是一个如何在交互式程序中运行示例,并且其行为与在 shell 中运行它完全相同。注意,我们必须在这里使用自己的 Stdin
实现,因为 tokio::io::stdin()
实际上是阻塞的,因此作为交互式应用程序的一部分进行轮询不会正确工作。这里省略了 Stdin
的实现,但您可以在仓库中的 examples/shell.rs
中查看完整的实现。
let mut argv = std::env::args();
argv.next().unwrap();
let cmd = argv.next().unwrap();
let args: Vec<_> = argv.collect();
let process =
tokio_pty_process_stream::Process::new(&cmd, &args, Stdin::new());
let _raw = crossterm::RawScreen::into_raw_mode().unwrap();
tokio::run(
process
.for_each(|ev| {
match ev {
tokio_pty_process_stream::Event::CommandStart {
..
} => {}
tokio_pty_process_stream::Event::Output { data } => {
let stdout = std::io::stdout();
let mut stdout = stdout.lock();
stdout.write_all(&data).unwrap();
stdout.flush().unwrap();
}
tokio_pty_process_stream::Event::CommandExit {
..
} => {}
}
futures::future::ok(())
})
.map_err(|e| panic!(e)),
);
依赖关系
~8MB
~139K SLoC