Rust Crate 使用:structopt

structopt

Github
Crates.io

前言

在前一篇介绍了命令行解析库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交互。

你可能感兴趣的:(Rust Crate 使用:structopt)