Как я могу получить доступ к переменной времени выполнения в определениях stuctopt? - PullRequest
1 голос
/ 27 апреля 2020

Я хотел бы иметь возможность использовать значение переменной (или, что еще лучше, возвращение function(arg)) в качестве строки about для программы CLI, определенной с использованием structopt. Конечной целью является полностью локализованный интерфейс командной строки, который определяет системный язык или переменную ENV и загружает локализованные строки, которые запекаются в сообщении --help и т. Д. c.

. По умолчанию используется комментарий документации :

/// 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? Нужно ли мне как-то получить доступ к основным интерфейсам хлопка?

1 Ответ

1 голос
/ 27 апреля 2020

StructOpt просто добавляет производный макрос и соответствующую черту над хлопком. Ящик хлопка имеет функцию , устанавливающую сообщение about во время выполнения , поэтому нам просто нужно добавить это. Если мы посмотрим на как from_args работает , то увидим, что он создает структуру clap App, прежде чем превратить ее в определяемую пользователем структуру.

Таким образом, чтобы делать то, что вы хотите :

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);
}
...