解析docopt参数类型(任何语言)

时间:2015-01-29 08:39:26

标签: python go rust docopt

我有一个用例提供docopt字符串的用例,并在此基础上生成一些代码。所以我不知道我的docopt字符串。

对于某些"参数类型" (不是数据类型),我希望生成各种代码。

在下文中,我将区分"类型"和"数据类型"。对于docopt参数--arg=DEGREES和argv输入--arg=10,"类型" --arg的{​​{1}}是DEGREES,而数据类型是integer。值为10

用户可以给我以下docopt字符串:

Naval Fate.

Usage:
  naval_fate --dir=FILE [--speed=ABC]

Options:
  --dir=FILE   Moored (anchored) mine.
  --speed=ABC  Speed in knots [default: 10].

除了像往常一样解析这个docopt字符串之外,我还试图找出"键入"参数dirspeed请求。我想知道dir的类型为FILE,而speed的类型为ABC

示例:

鉴于上面的docopt字符串和一个argv字符串naval_fate --dir=/tmp --speed 1234,我希望不仅可以访问值和数据类型(<key> => <value,datatype>),还可以访问&#34; config类型&#34; (<key> => <value,datatype,argtype>,即:

dir =&gt; val:/tmp,数据类型:String类型:FILE
speed =&gt; val:1234,数据类型:Integer类型:ABC

docopt的任何(托管)实现都是可以接受的,包括Python,但最好是我正在寻找一种编译语言的解决方案,无论是C,Go,Rust等。

1 个答案:

答案 0 :(得分:1)

使用Rust's Docopt

非常简单
#![allow(unstable)]

extern crate docopt;

use docopt::Docopt;

static USAGE: &'static str = "
Naval Fate.

Usage:
    naval_fate ship --dir=FILE [--speed <kn>]
    naval_fate (-h | --help)

Options:
    -h --help     Show this screen.
    --speed <kn>  Speed in knots [default: 10].
    --dir=FILE    Moored (anchored) mine.
";

fn main() {
    let args = Docopt::new(USAGE)
                      .and_then(|d| d.parse())
                      .unwrap_or_else(|e| e.exit());
    println!("Type of 'ship': {:?}", args.find("ship"));
    println!("Type of '--dir': {:?}", args.find("--dir"));
    println!("Type of '--speed': {:?}", args.find("--speed"));
}

哪个输出:

$ ./target/scratch ship --dir /tmp --speed 1234                                        
Type of 'ship': Some(Switch(true))                                                                       
Type of '--dir': Some(Plain(Some("/tmp")))                                                               
Type of '--speed': Some(Plain(Some("1234"))) 

关键是find的返回类型是Value,这是一种代数数据类型:http://burntsushi.net/rustdoc/docopt/enum.Value.html ---所以通过构造,你得到的是“类型”免费论证。

请注意,这将适用于Docopt用法字符串中的任何“参数”,即使它未传递到参数列表中。