一、编写目的
实在是找不到讲解clap-rs的文章(对国内rust生态感到无力,教程少啊),所以啃了啃源码,简单讲下clap的使用,也好在以后自己忘了怎么用,可以回来看看,一次更不完的,后面会陆续补充
二、clap简介
Rust的clap库是一个用于命令行接口应用程序的参数解析器,主要功能是帮助开发者更轻松、高效的创建具有复杂命令行选项、参数和子命令的应用程序。开发者可以定义命令的结构、所需参数、选项格式、默认值、规则等。
除clap还有structopt、pico-args、getopts等库,不过只能提供较简单的命令解析,不如clap功能全面,如果仅做简单的命令行工具可以使用上述其他库。
三、基础使用
首先cargo.toml引入clap
clap = { version = "4.5.4", features = ["derive"] }
或者直接引入
cargo add clap --features derive
不多说直接看例子,最烦的就是讲一大堆不放例子的文了
use clap::Parser;
#[test]
fn basic() {
#[derive(Parser, PartialEq, Debug)]
struct Opt {
#[arg(short = 'a', long = "arg")]
arg: i32,
}
assert_eq!(
Opt { arg: 24 },
Opt::try_parse_from(["test", "-a24"]).unwrap()
);
}
最基础的使用就是在struct添加derive宏
可以看到Parser就是一个过程宏,具体不看,无非就是为struct实现一些trait,对过程宏有兴趣的可以啃啃,不过比较枯燥。
接下来就是struct中字段上的#[arg(short = 'a', long = "arg")]
,arg宏的作用是设定字段为参数,这个参数就是命令行输入的参数,其中short为短参,long为长参,命令行中的输入如:-u https://bilibili.com --url https://bilibili.com
-u和后面的参数中间的空格可以省略,–url同理。
Opt::try_parse_from(["test","-a24])
是代码层面构建结构体的方法,其中test是一个名称,类似于给结构体的一个别称,并不重要,-a24
即对应命令行参数,try_parse_from()
一般用于测试。
再来一个简单的示例:
use clap::Parser;
#[derive(Parser, Debug)]
#[command(name = "zoo")]
struct Life{
#[arg(short = 'a')]
animal:String,
}
fn main(){
let life = Life::parse();
println!("output:{}",life.animal);
}
命令行执行:
PS Y:\rust\clap_test> cargo run -- -a pig
Compiling clap_test v0.1.0 (Y:\rust\clap_test)
Finished dev [unoptimized + debuginfo] target(s) in 0.81s
Running `target\debug\clap_test.exe -a pig`
output:pig
其中有个问题就是#[command(name = "zoo")]
的name并没有找到具体的作用,按照程序来说应该是将zoo作为主命令 后面跟参数-a,但是build之后的.exe在执行clap_test -h后显示却是如下
Usage: clap_test.exe -a <ANIMAL>
Options:
-a <ANIMAL>
-h, --help Print help
可见并没有出现zoo的字眼,矛盾的是通过程序获取help信息却出现了zoo
let output = <T as CommandFactory>::command().render_help().to_string();
output内容为:
Usage: zoo -a <ANIMAL>
Options:
-a <ANIMAL>
-h, --help Print help
这就很令人困惑了,目前尚不知如何解释,如果有知道的可以评论区解惑下,感谢。
1. 理论不如实践,开发一个HTTP请求工具
- 需求
使用clap库开发一个http命令行请求工具,可以发送GET或POST请求,允许携带参数,并将响应结果返回。 - 设计
命令行调用方式示例:
http get https://bilibili.com -a param1=1
http post https://bilibili.com -b param1=1 -b param2=2
- 代码
此处不贴代码,后续会上传InsCode项目,大家可以去云上运行容器测试该工具(审核真的好慢)
容器运行需要初始化环境和依赖,要等一会
初始化完成后,就可以测试了
clap暂时更新到这,后续有用到其他功能会继续补充