[英]Using a structure as a command line argument in clap
尝试在clap
的结构中使用结构:
use clap::{Args, Parser};
use std::path::PathBuf;
#[derive(Parser, Debug)]
enum Command {
Foo(Foo),
}
#[derive(Args, Debug)]
struct Foo {
bar: Option<Bar>,
path: PathBuf,
}
#[derive(Parser, Clone, Debug)]
struct Bar {
bla: u8,
bla_2: String,
}
fn main() {
let cli = Command::parse();
println!("cli {:#?}", cli);
}
所以我可以使用以下选项调用应用程序: cargo run -- foo bar 42 baz /tmp/a
或只是cargo run -- foo /tmp/a
因为bar
参数是可选的。
但是,目前它没有构建:
--> src/main.rs:11:5
|
11 | bar: Option<Bar>,
| ^^^ the trait `FromStr` is not implemented for `Bar`
|
而且由于Bar
中的值必须以空格分隔,因此实现FromStr
都不会成功。
目前甚至有可能在clap
中做这种时尚的事情吗?
您的代码有几个问题。 最大的一个是:
在您的情况下这是一个问题,因为您的命令行如下所示:
cargo run -- <required> [optional] /tmp/a
如果最后有一个必需的路径,则在此之前不能有可选的位置参数。
进一步的问题:
#[derive(Parser)]
应该附加到struct
,而不是enum
。#[derive(Parser)]
,它代表参数解析器的入口对象。 除了指出你的问题,我不确定还能如何帮助你。 如果调用cargo run -- foo bar 42 baz /tmp/a
和cargo run -- foo /tmp/a
是不可协商的,我认为clap
不适合你; 我认为您应该手动解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.