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)
30KB
516 行
这个 crate 通过在进程过程中模拟管道 io 来帮助自动化命令工具。
为什么选择这个 crate
交互式命令工具利用 stdin、stdout 和 stderr 进行通信。如果您想将命令工具作为库(不启动进程)使用,并且工具作者同意,这个 crate 可以帮助自动化输入/输出,只需 3 步
-
定义一个
Altio
变量,例如let io = Altio::default();
. -
用 altio 的等效 API 替换 std API,例如将
println!(...)
替换为writeln!( io.out(), ... )
,将std::io::stdin()
替换为io.input()
. -
尽可能简化 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许可证,由您自行选择。