structopt
前言
在前一篇介紹了命令行解析庫(kù)clap
嫉嘀,它支持函數(shù)調(diào)用模式,宏模式魄揉,以及YAML模式剪侮,雖然它讓我們用極其簡(jiǎn)單的方式定義傳參,但還是需要自己去匹配結(jié)果洛退,這過(guò)程中不乏結(jié)構(gòu)體瓣俯,數(shù)組轉(zhuǎn)換。所以鄙人又找到了一個(gè)基于結(jié)構(gòu)體的解析命令行庫(kù)兵怯,簡(jiǎn)化我們解析傳參結(jié)果彩匕。
介紹
structopt
是一個(gè)通過(guò)結(jié)構(gòu)體來(lái)解析命令行參數(shù)∶角可以說(shuō)它對(duì)clap
庫(kù)進(jìn)行補(bǔ)充推掸。
使用
或許有些同學(xué)不了解clap
的使用桶蝎,我用一個(gè)例子簡(jiǎn)單描述下,這有助于我們理解structopt
庫(kù)的功能與作用谅畅。
起初
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")
}
}
如果想把匹配后的結(jié)果進(jìn)行管理登渣,便于后面使用,這時(shí)就需要自行去創(chuàng)建一個(gè)結(jié)構(gòu)體并保存毡泻,操作上顯得啰嗦胜茧。
現(xiàn)在
#[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" }
現(xiàn)在所有傳參都已經(jīng)解析好,保存在結(jié)構(gòu)體中了仇味,方便我們后續(xù)使用呻顽。
由于上面初略使用了structopt
庫(kù),現(xiàn)在你可能有幾個(gè)疑問(wèn)丹墨,我這邊列舉幾個(gè)廊遍,其實(shí)這些問(wèn)題你能在structopt
文檔上一一找到答案:
- 如何定義命令的幾個(gè)屬性,name贩挣, short喉前, default_value,help等王财。
- 如何定義一個(gè)子命令卵迂。
- 子命令能否分開(kāi)定義并組合。
- 如何自定義字符串解析绒净。
- 如何與clap交互见咒。