0

我有一个用例,用户提供一个 docopt 字符串,并基于它生成一些代码。所以我不知道我的docopt字符串在前面。

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

在下文中,我将区分“类型”和“数据类型”。对于 docopt 参数--arg=DEGREES和 argv input --arg=10,“类型”--argDEGREES,而数据类型是integer。值为10

用户可以给我以下文档字符串:

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是 typeFILE并且speed是 type ABC

例子:

鉴于上面的 docopt 字符串和一个 argv 字符串naval_fate --dir=/tmp --speed 1234,我希望不仅可以访问值和数据类型 ( <key> => <value,datatype>),还希望访问“配置类型” ( <key> => <value,datatype,argtype>,即类似于以下内容的内容:

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

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

4

1 回答 1

1

使用Rust 的 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关键是is的返回类型Value,它是一个代数数据类型:http ://burntsushi.net/rustdoc/docopt/enum.Value.html --- 所以通过构造,你得到了参数的“类型”免费。

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

于 2015-01-29T12:15:38.293 回答