Как я могу отличить опцию множественного вхождения от последующего необязательного аргумента с structopt? - PullRequest
0 голосов
/ 15 февраля 2019

Я использую structopt для определения аргументов, которые можно использовать

mfe -s opt1 -s opt2 -s opt2 this_is_an_argument

или

mfe -s opt1 opt2 opt3 this_is_an_argument

Проблема в том, что аргумент this_is_an_argument анализируется как опция.Я знаю, что мог бы использовать -- перед аргументом, но есть ли лучшее решение?

use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt, Debug)]
struct CLIArgs {
    #[structopt(short = "s", long = "str")]
    strings: Vec<String>,

    #[structopt(name = "PATH", parse(from_os_str))]
    path: Option<PathBuf>,
}

fn main() {
    let args = CLIArgs::from_args();
    println!("{:?}", args);
}
$ mfe -s foo bar baz /this/is/a/path
CLIArgs { strings: ["foo", "bar", "baz", "/this/is/a/path"], path: None }

Я бы хотел, чтобы /this/is/a/path был проанализирован как path, без необходимости использования--.Может быть, сделать что-то с порядком аргументов или что-то?

1 Ответ

0 голосов
/ 16 февраля 2019

Итак, я нашел следующее решение:

use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt, Debug)]
struct CLIArgs {
    #[structopt(short = "s", long = "str", raw(number_of_values = "1"))]
    strings: Vec<String>,

    #[structopt(name = "PATH", parse(from_os_str))]
    path: Option<PathBuf>,
}

fn main() {
    let args = CLIArgs::from_args();
    println!("{:?}", args);
}

Обратите внимание, что это заставляет пользователя использовать программу таким образом:

$ mfe -s foo -s bar -s baz /this/is/a/path

, что может быть неудобно, в зависимости от вашего использованияслучай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...