首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在clap中使用结构作为命令行参数

在clap中使用结构作为命令行参数
EN

Stack Overflow用户
提问于 2022-07-16 11:31:47
回答 1查看 627关注 0票数 0

试图在clap中的结构中使用结构

代码语言:javascript
复制
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/acargo run -- foo /tmp/a,因为bar参数是可选的。

但是,目前它没有构建:

代码语言:javascript
复制
  --> src/main.rs:11:5
   |
11 |     bar: Option<Bar>,
   |     ^^^ the trait `FromStr` is not implemented for `Bar`
   |

而且,由于Bar中的值必须是空间分隔的,所以实现FromStr不会有什么效果。

在目前的clap中,有可能做一些这样的事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-16 12:37:49

您的代码有几个问题。最大的一项是:

  • 是一个可选的位置项,它永远不会出现在之前--一个必需的位置参数

在您的情况下,这是一个问题,因为命令行如下所示:

代码语言:javascript
复制
cargo run -- <required> [optional] /tmp/a

如果您在最后有一个必需的路径,那么在此之前,不能是一个可选的位置参数。

进一步的问题:

  • #[derive(Parser)]应该附加到struct,而不是enum.
  • There应该是一个#[derive(Parser)],它代表参数解析器的条目对象。

除了指出你的问题之外,我不知道还能怎样帮助你。如果调用cargo run -- foo bar 42 baz /tmp/acargo run -- foo /tmp/a是不可协商的,我认为clap不是适合您的库;我认为您应该手工解析。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73003835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档