[英]Dynamically generating arguments Clap
我试图弄清楚如何使用 Clap 从输入参数动态生成参数。
我试图用 Clap 模拟的是以下 python 代码:
parser = argparse.ArgumentParser()
parser.add_argument("-i", type=str, nargs="*")
(input_args, additional_args) = parser.parse_known_args()
for arg in input_args:
parser.add_argument(f'--{arg}-bar', required=true, type=str)
additional_config = parser.parse_args(additional_args)
这样您就可以在命令中执行以下操作:
./foo.py -i foo bar baz --foo-bar foo --bar-bar bar --baz-bar bar
并从第一个参数动态生成附加参数。 不确定是否可以在 Clap 中执行,但我认为这可能是因为自述文件说明您可以使用构建器模式动态生成参数 [1]。
所以这是我尝试这样做的天真尝试。
use clap::{Arg, App};
fn main() {
let mut app = App::new("foo")
.arg(Arg::new("input")
.short('i')
.value_name("INPUT")
.multiple(true)
.required(true));
let matches = app.get_matches_mut();
let input: Vec<_> = matches.values_of("input").unwrap().collect()
for i in input {
app.arg(Arg::new(&*format!("{}-bar", i)).required(true))
}
}
这显然不会让编译器为!format
生命周期和app.arg
向你尖叫我最感兴趣的是解决如何为app
生成新参数,然后可以再次匹配。 我对 Rust 很陌生,因此 Clap 很可能无法做到这一点。
[1] https://github.com/clap-rs/clap
我认为这是可能的,因为自述文件说明您可以使用构建器模式动态生成参数 [1]。
动态生成参数意味着,您可以使用运行.arg
并且它会正常工作(也就是说,不需要在编译时完全定义整个 CLI,这种区别在 Python 中不存在,因为一切都在运行)。
当您传递未知参数然后重新解析它们时,您在这里所做的事情要复杂得多(并且专门和奇怪)。
现在首先,你真的不能在 clap 中重用App
:它的大多数方法(非常包括get_matches
)采取self
并因此“消费”应用程序并返回其他东西,原始应用程序或结果。 尽管您可以在get_matches
之前clone
原始应用程序,但我想。
但我认为这在这里没有用:虽然我没有尝试过它应该可以使用TrailingVarArg
做你想做的事:这会将所有尾随参数收集到一个位置参数切片中( 你可能还需要AllowLeadingHyphen
),然后您可以使用动态生成的参数创建第二个App
,以便解析该参数子集( get_matches_from
将从迭代器而不是 env args 解析,这对于测试...或这种确切类型的情况很有用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.