[英]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.