动态生成参数 Clap

Sig*_*and 7 command-line-arguments rust clap

我正在尝试弄清楚如何使用 Clap 从输入参数动态生成参数。

\n

我试图用 Clap 模拟以下 python 代码:

\n
parser = argparse.ArgumentParser()\nparser.add_argument("-i", type=str, nargs="*")\n(input_args, additional_args) = parser.parse_known_args()\nfor arg in input_args:\n  parser.add_argument(f\'--{arg}-bar\', required=true, type=str)\n\nadditional_config = parser.parse_args(additional_args)\n
Run Code Online (Sandbox Code Playgroud)\n

这样您就可以在命令中执行以下操作:

\n
./foo.py -i foo bar baz --foo-bar foo --bar-bar bar --baz-bar bar\n
Run Code Online (Sandbox Code Playgroud)\n

并从第一个参数动态生成附加参数。不确定是否可以在 Clap 中执行,但我认为这是可能的,因为自述文件指出您可以使用构建器模式动态生成参数 [1]。

\n

所以这是我尝试这样做的天真的尝试。

\n
use clap::{Arg, App};\n\nfn main()\xc2\xa0{\n  let mut app = App::new("foo")\n               .arg(Arg::new("input")\n               .short(\'i\')\n               .value_name("INPUT")\n               .multiple(true)\n               .required(true));\n  let matches = app.get_matches_mut();\n  let input: Vec<_> = matches.values_of("input").unwrap().collect()\n  for i in input {\n    app.arg(Arg::new(&*format!("{}-bar", i)).required(true))\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这显然不会让编译器在你的一生中对你尖叫!formatapp.arg我最感兴趣的是解决如何生成新的参数,app然后可以再次匹配。我对 Rust 还很陌生,所以 Clap 很可能无法做到这一点。

\n

[1]\xc2\xa0https://github.com/clap-rs/clap

\n

Mas*_*inn 1

我认为这是可能的,因为自述文件指出您可以使用构建器模式动态生成参数[1]。

动态生成参数意味着,您可以.arg使用运行时值并且它会正常工作(也就是说整个 CLI 不需要在编译时完全定义,这种区别在 Python 中不存在,因为一切都是在运行时完成的) 。

当您传递未知参数然后重新解析它们时,您在这里所做的事情明显更加复杂(并且专业且奇怪) 。

现在首先,您实际上无法App在 clap 中重用:它的大多数方法(非常包括get_matches)都会获取self并因此“消耗”应用程序并返回其他内容,无论是原始应用程序还是结果。虽然我猜你可以clone在你之前使用原始应用程序。get_matches

但我认为这在这里没有用:虽然我没有尝试过,但应该可以做你想做的事情TrailingVarArg:这会将所有尾随参数收集到单个位置参数切片中(你可能AllowLeadingHyphen需要),然后你可以使用动态生成的参数创建第二个 App参数,以便解析该参数子集(get_matches_from将从迭代器而不是 env args 进行解析,这对于测试...或对于这种确切的情况很有用)。