美文网首页GoRust Crate
Rust Crate 使用:structopt

Rust Crate 使用:structopt

作者: kayryu | 来源:发表于2019-03-07 20:50 被阅读37次

    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

        本文链接:https://www.haomeiwen.com/subject/akzhpqtx.html