Определите пользовательский синтаксический анализатор, используя structopt, который изменяется на основе другого флага - PullRequest
2 голосов
/ 24 июня 2019

Я использую structopt , чтобы проанализировать аргументы командной строки для моего приложения ржавчины.Этими флагами являются следующие: query (позиционный) и case_sensitive (необязательный).

#[derive(StructOpt, Debug)]
pub struct Config {
    /// Query to search for.
    #[structopt(parse(try_from_str = "parse_regex"))]
    query: Regex,

    /// Specify whether or not the query is case sensitive.
    #[structopt(long)]
    case_sensitive: bool,
}

В конечном итоге я хочу написать parse_regex, который создает регулярное выражение изаргумент строки запроса.

fn parse_regex(src: &str) -> Result<Regex, Error> {
    let case_sensitive = true; // !!! problem here: how to grab the value of the `case_sensitive` flag?
    RegexBuilder::new(src).case_insensitive(!case_sensitive).build()
}

Мне интересно, возможно ли, чтобы пользовательская функция синтаксического анализа захватила значение другого флага (в данном случае case_sensitive), чтобыдинамически анализировать свой собственный флаг.

1 Ответ

0 голосов
/ 24 июня 2019

В командной строке флаги обычно можно передавать в любом порядке. Это затрудняет введение такого рода зависимости в парсер .

Поэтому я рекомендую ввести двухэтапную обработку:

  1. Соберите флаги с некоторой предварительной обработкой.
  2. Обрабатывать взаимодействия.

В вашем случае:

#[derive(StructOpt, Debug)]
pub struct Config {
    /// Query to search for.
    #[structopt(string)]
    query: String,

    /// Specify whether or not the query is case sensitive.
    #[structopt(long)]
    case_sensitive: bool,
}

А потом позже:

fn build_regex(config: &Config) -> Result<Regex, Error> {
    RegexBuilder::new(&config.query)
        .case_insensitive(!config.case_sensitive)
        .build()
}
...