簡體   English   中英

在 clap 中使用結構作為命令行參數

[英]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/acargo run -- foo /tmp/a是不可協商的,我認為clap不適合你; 我認為您應該手動解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM