尝试在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
中是否有可能做这种事情?
1条答案
按热度按时间n9vozmp41#
你的代码有几个问题。最大的一个是:
这是一个问题,因为你的命令行看起来像这样:
如果你在末尾有一个必需的路径,在它之前不能有一个可选的位置参数。
其他问题:
#[derive(Parser)]
应该连接到struct
,而不是enum
。#[derive(Parser)]
,它表示参数解析器的入口对象。如果
cargo run -- foo bar 42 baz /tmp/a
和cargo run -- foo /tmp/a
的调用是不可协商的,我认为clap
不是适合你的库;我认为你应该用手来解析。