Как использовать аргумент CLI после подкоманды с ящиком structopt? - PullRequest
2 голосов
/ 22 января 2020

Например, запуск моего приложения с

./app --foo=bar get

работает хорошо, но

./app get --foo=bar

выдает ошибку:

error: Found argument '--foo' which wasn't expected, or isn't valid in this context

USAGE:
    app --foo <foo> get

Код:

use structopt::*;

#[derive(Debug, StructOpt)]
#[structopt(name = "app")]
struct CliArgs {
    #[structopt(long)]
    foo: String,
    #[structopt(subcommand)]
    cmd: Cmd,
}

#[derive(Debug, StructOpt)]
enum Cmd {
    Get,
    Set,
}

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

Зависимости:

structopt = { version = "0.3", features = [ "paw" ] }
paw = "1.0"

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вам нужно предоставить другую структуру для каждого варианта перечисления команд, имеющего аргументы:

use structopt::*; // 0.3.8

#[derive(Debug, StructOpt)]
struct CliArgs {
    #[structopt(subcommand)]
    cmd: Cmd,
}

#[derive(Debug, StructOpt)]
enum Cmd {
    Get(GetArgs),
    Set,
}

#[derive(Debug, StructOpt)]
struct GetArgs {
    #[structopt(long)]
    foo: String,
}

fn main() {
    let args = CliArgs::from_args();
    println!("{:?}", args);
}
./target/debug/example get --foo=1
CliArgs { cmd: Get(GetArgs { foo: "1" }) }
1 голос
/ 23 января 2020

Согласно выпуск 237 , есть параметр global. Неожиданно, это не упомянуто в документации.

С global = true это работает хорошо:

use structopt::*;

#[derive(Debug, StructOpt)]
#[structopt(name = "cli")]
struct CliArgs {
    #[structopt(
        long,
        global = true,
        default_value = "")]
    foo: String,
    #[structopt(subcommand)]
    cmd: Cmd,
}

#[derive(Debug, StructOpt)]
enum Cmd {
    Get,
    Set,
}

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

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

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