试图在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中,有可能做一些这样的事情吗?
发布于 2022-07-16 12:37:49
您的代码有几个问题。最大的一项是:
在您的情况下,这是一个问题,因为命令行如下所示:
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不是适合您的库;我认为您应该手工解析。
https://stackoverflow.com/questions/73003835
复制相似问题