Как использовать перечисление, которое представляет подкоманды со StructOpt? - PullRequest
0 голосов
/ 04 июня 2018

Ссылаясь на пример "Git" StructOpt , я не понимаю, как я тогда должен использовать данные из аргументов.

Я довольно новичок в Rust, поэтому яЯ предполагаю, что это очевидно.К сожалению, все примеры, которые я могу найти с перечислением, только делают println! для объекта, поэтому я застрял.Я думал, что я сделаю match, но он не работает.

Как бы вы узнали, какие команды были переданы пользователем для запуска вашей программы?

#[macro_use]
extern crate structopt;

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

#[derive(StructOpt, Debug)]
#[structopt(name = "git", about = "the stupid content tracker")]
enum Git {
    #[structopt(name = "add")]
    Add {
        #[structopt(short = "i")]
        interactive: bool,
        #[structopt(short = "p")]
        patch: bool,
        #[structopt(parse(from_os_str))]
        files: Vec<PathBuf>
    },
    #[structopt(name = "fetch")]
    Fetch {
        #[structopt(long = "dry-run")]
        dry_run: bool,
        #[structopt(long = "all")]
        all: bool,
        repository: Option<String>
    },
    #[structopt(name = "commit")]
    Commit {
        #[structopt(short = "m")]
        message: Option<String>,
        #[structopt(short = "a")]
        all: bool
    }
}

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

    match opt() {
        Git::Add(cmd) => println!("{:?}", cmd.interactive),
        _ => (),
    }
}

Компиляция:

05:42 $ cargo run -- add -i
   Compiling example v0.1.0 (file:///Users/froyer/src/example)
error[E0532]: expected tuple struct/variant, found struct variant `Git::Add`
  --> src/main.rs:41:9
   |
41 |         Git::Add(cmd) => println!("{:?}", cmd.interactive),
   |         ^^^^^^^^ did you mean `Git::Add { /* fields */ }`?

error[E0618]: expected function, found enum variant `opt`
  --> src/main.rs:40:11
   |
37 |     let opt = Git::from_args();
   |         --- `opt` defined here
...
40 |     match opt() {
   |           ^^^^^ not a function
help: `opt` is a unit variant, you need to write it without the parenthesis
   |
40 |     match opt {
   |           ^^^

1 Ответ

0 голосов
/ 04 июня 2018

Благодаря проблеме # 1 в репозитории structopt я наконец понял, как это должно работать:)

fn main () {
    match Git::from_args() {
        Git::Add { interactive, patch, files } => {
            println!("{:?}", interactive)
        },
        Git::Commit { message, all } => {
            //...
        }
        _ => (),
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...