structopt
前言
在前一篇介绍了命令行解析库clap
,它支持函数调用模式,宏模式,以及YAML模式,虽然它让我们用极其简单的方式定义传参,但还是需要自己去匹配结果,这过程中不乏结构体,数组转换。所以鄙人又找到了一个基于结构体的解析命令行库,简化我们解析传参结果。
介绍
structopt
是一个通过结构体来解析命令行参数。可以说它对clap
库进行补充。
使用
或许有些同学不了解clap
的使用,我用一个例子简单描述下,这有助于我们理解structopt
库的功能与作用。
起初
extern crate clap;
use clap::{Arg, App};
fn main() {
let matches = App::new("MayApp")
.arg(Arg::with_name("verbose")
.short("v")
.multiple(true)
.help("verbosity level"))
.args_from_usage("-p, --path=[FILE] 'Target file you want to change'")
.get_matches();
if let Some(f) = matches.value_of("path") {
println!("path : {}", f);
}
if _ = matches.occurrences_of("verbose") {
0 => println!("zero"),
1 => println!("one"),
_ => println!("more")
}
}
如果想把匹配后的结果进行管理,便于后面使用,这时就需要自行去创建一个结构体并保存,操作上显得啰嗦。
现在
#[macro_use] extern crate structopt;
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
#[structopt(name = "MayApp", about = "An example of StructOpt usage.")]
struct Opt {
/// verbosity level
#[structopt(short = "v", parse(from_occurrences))]
verbose: u32,
/// Set speed
#[structopt(short = "s", long = "speed", default_value = "42")]
speed: f64,
/// Input file
#[structopt(parse(from_str))]
input: String,
}
fn main() {
let opt = Opt::from_args();
println!("{:?}", opt);
}
输入与输出:
>>>
cargo run --example u-structopt -- -vvv abc
>>>
Opt { verbose: 3, speed: 42.0, input: "abc" }
现在所有传参都已经解析好,保存在结构体中了,方便我们后续使用。
由于上面初略使用了structopt
库,现在你可能有几个疑问,我这边列举几个,其实这些问题你能在structopt
文档上一一找到答案:
- 如何定义命令的几个属性,name, short, default_value,help等。
- 如何定义一个子命令。
- 子命令能否分开定义并组合。
- 如何自定义字符串解析。
- 如何与clap交互。