#io #redirect #piped #automate #expect

altio

通过在进程过程中模拟管道 io 自动化命令工具

4 个版本

0.2.0 2024年1月31日
0.1.2 2024年1月12日
0.1.1 2023年12月26日
0.1.0 2023年12月26日

#322命令行界面


2 个 Crates 中使用(通过 heartless

MIT/Apache

30KB
516

这个 crate 通过在进程过程中模拟管道 io 来帮助自动化命令工具。

为什么选择这个 crate

交互式命令工具利用 stdin、stdout 和 stderr 进行通信。如果您想将命令工具作为库(不启动进程)使用,并且工具作者同意,这个 crate 可以帮助自动化输入/输出,只需 3 步

  1. 定义一个 Altio 变量,例如 let io = Altio::default();.

  2. 用 altio 的等效 API 替换 std API,例如将 println!(...) 替换为 writeln!( io.out(), ... ),将 std::io::stdin() 替换为 io.input().

  3. 尽可能简化 main.rs,例如 fn main() { the_tool::run( std::env::args_os() )}.

工具作者的示例

[dependencies]
altio = { version = "0.2", no_default_features = true }

[features]
altio = ["altio/altio"]
// lib.rs
pub struct TheTool {
    // fields omitted
    pub io: Altio,
}

impl_altio_output!( TheTool );

当将工具构建为应用程序时,"altio" 功能被禁用,altio 将回退到 stdio。

当将工具作为库构建时,工具用户可以调用send/recv方法与工具进行通信,例如:send_line()try_recv_line()

工具用户示例

the_tool = { version = "1.0", features = ["altio"] }
let args = std::env::args_os(); // clap::Parser::parse_from()
let tool = the_tool::new();
let tool_io = tool.io.clone();

// `io.input().read_line()` called occasionally
std::thread::spawn( || tool.run( args ));

loop {
    if let Some( received ) = tool_io.try_recv_line() {
        if received == "Lorum" {
            tool_io.send_line( "Ipsum" );
        }
    }
}

许可证

根据Apache License 2.0或MIT许可证,由您自行选择。

无运行时依赖

特性