我有一个用例提供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字符串之外,我还试图找出"键入"参数dir
和speed
请求。我想知道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等。
答案 0 :(得分:1)
#![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用法字符串中的任何“参数”,即使它未传递到参数列表中。