#pty #future

tokio-pty-process-stream

封装 tokio-pty-process 以提供更简单的 API,作为一个单个流对象

2 个不稳定版本

0.2.0 2019年10月27日
0.1.0 2019年10月24日

1226异步

44 每月下载量
teleterm 中使用

MIT 许可证

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