使用docopt和Rust解析带有参数的命令行标志,类似于getopt
我正在寻找一种方法来模拟C如何使用使用docopt和Rust解析带有参数的命令行标志,类似于getopt,rust,docopt,Rust,Docopt,我正在寻找一种方法来模拟C如何使用getopt。我想使用docopt将下面的C代码段转换为Rust。我似乎无法将标志传递到命令行参数: char in; char* stringName; while(( in = getopt( argc, argv, "a:b:c:d:e:")) != EOF) { switch(in) { case 'a': stringName = optarg; break; // ..
getopt
。我想使用docopt将下面的C代码段转换为Rust。我似乎无法将标志传递到命令行参数:
char in;
char* stringName;
while(( in = getopt( argc, argv, "a:b:c:d:e:")) != EOF) {
switch(in) {
case 'a':
stringName = optarg;
break;
// ... and so on
那我要跑了
cargo run -a "hello" -b 3 ... and so on
到目前为止,我已经写了以下内容:
extern crate rustc_serialize;
extern crate docopt;
use docopt::Docopt;
// Define a USAGE string
const USAGE: &'static str = "
Program.
Usage: [options] [<value1>] [options] [<value2>] [options] [<value3>] [options] [<value4>]
Options:
-a,
-b,
-c,
-d,
";
#[derive(Debug, RustcDecodable)]
struct Args {
arg_value1: Option<String>,
flag_a: bool,
flag_b: bool,
flag_c: bool,
arg_value2: Option<String>,
arg_value3: Option<String>,
arg_value4: Option<String>,
}
fn main() {
let args: Args = Docopt::new(USAGE)
.and_then(|d| d.decode())
.unwrap_or_else(|e| e.exit());
println!("{:?}", args);
}
extern板条箱生锈序列化;
外部板条箱docopt;
使用docopt::docopt;
//定义用法字符串
常量用法:&'static str='
节目。
用法:[options][][options][][options][][[options][]
选项:
-a,,
-b,,
-c,
-d,
";
#[派生(调试,可恢复)]
结构参数{
参数值1:选项,
旗帜a:布尔,
旗帜b:布尔,
国旗c:布尔,
参数值2:选项,
参数值3:选项,
参数值4:选项,
}
fn main(){
让args:args=Docopt::new(用法)
然后(| d | d.decode())
.打开包装或其他(| e | e.退出());
println!(“{:?}”,args);
}
当我货物运行时
我得到
未知标志-a
类似这样的事情可能会让你非常接近:
const USAGE: &'static str = "
Program.
Usage: program [options]
Options:
-a VALUE
-b VALUE
-c VALUE
-d VALUE
";
#[derive(Debug, RustcDecodable)]
struct Args {
flag_a: Option<String>,
flag_b: Option<i32>,
flag_c: Option<String>,
flag_d: Option<String>,
}
然后,您可以在标记a
上进行模式匹配,以判断是否提供了它(从而获得值)。不需要有单独的布尔标志,在这种情况下,选项
更好
同样,当您通过
cargo run
执行程序时,必须将cargo
的参数与程序的参数区分开来。大多数(所有?)执行此操作的程序都使用特殊标志--
。这将分离程序之间的参数。您也可以在程序生成后直接运行该程序:
$cargo build
$./target/debug/program\u name-a“hello”-b 3
请显示您尝试过的代码以及您遇到的问题it@ker我已经把它添加到编辑中了我不认为你的docopt规范做了你认为它做的事情。您如何知道为哪个值设置了哪个标志?您得到的Args
结构对于program-a“hi”-b2
和program-b“hi”-a2
具有相同的值。好的,我知道它有什么问题。但是,还有另一个问题。您提到您使用的是货物运输
,对吗?为了让它正确地将参数传递给程序,您需要在双破折号后指定它们,如下所示:cargo run--a“hi”-b2
。否则,cargo run
将无法决定哪些选项指向自身,哪些选项指向程序。但无论如何,@ker的担忧是绝对正确的。坦率地说,我不确定解析库中是否有任何参数可以满足您的要求(最多四个参数,每个参数有不同的标志)。您可能需要自己实现解析。这是非常有用的。因此,无论何时解析使用标志的命令行参数,都必须始终使用--作为第一个命令行参数?@BumptheTrump不,这不太正确。我加了一张便条。
Args { flag_a: Some("hello"), flag_b: Some(3), flag_c: None, flag_d: None }