2

我希望能够使用变量的值(或者更好的是 a 的返回function(arg))作为使用 structopt 定义的 CLI 程序的 about 字符串。最终目标是一个完全本地化的 CLI,它可以检测系统语言或 ENV var,并加载本地化的字符串,这些字符串会被烘焙到--help消息中,等等。

默认情况下,它使用文档注释:

/// My about string
#[derive(StructOpt)]
struct Cli {}

我发现我可以传递手动输入的字符串:

#[derive(StructOpt)]
#[structopt(about = "My about string")]
struct Cli {}

这更近了一步,但我真正想做的是传递一个变量:

let about: &str = "My about string";
#[derive(StructOpt)]
#[structopt(about = var!(about))]
struct Cli {}

最后一个块是伪代码,因为我不知道使用什么语法来实现这一点。最后,我需要的不仅仅是一个字符串切片,但我认为这是一个开始的地方。

如何将这样的值传递给 structopt?我是否需要以某种方式访问​​底层的 clap 接口?

4

1 回答 1

1

StructOpt 只是在 clap 上添加了一个派生宏和一个相应的特征。clap crate 有一个在运行时设置 about 消息的功能,所以我们只需要添加它。如果我们看看它是如何from_args工作的,我们可以看到它App在将其转换为用户定义的结构之前创建了 clap 结构。

因此,做你想做的事:

use structopt::StructOpt;

fn get_localized_about() -> &'static str {
    "localized string"
}

#[derive(Debug, StructOpt)]
struct Foo {}

fn main() {
    let foo = Foo::from_clap(&Foo::clap().about(get_localized_about()).get_matches());
    println!("{:#?}", foo);
}
于 2020-04-27T19:56:31.790 回答