Как использовать неопределенные аргументы с хлопком

Я хочу создать приложение CLI, используя библиотеку clap. Проблема в том, что я хочу использовать свое приложение следующим образом:

./my_app file.txt read2.txt -d

Цель состоит в том, чтобы я мог восстановить в своей программе в виде Vec со значениями file.txt read2.txt.

мой код:

use clap::{App, load_yaml};

#[derive(Debug)]
enum EFlag {
    Debug,
    None,
}

#[derive(Debug)]
pub struct Flag {
    debug: EFlag,
}

impl Flag {
    pub fn new() -> Flag {
        Flag {
            debug: EFlag::None,
        }
    }

    pub fn fill_flag(&mut self) {
        let yaml = load_yaml!("cli.yaml");
        let matches = App::from(yaml).get_matches();

        match matches.is_present("debug") {
            true => self.debug = EFlag::Debug,
            _ => self.debug = EFlag::None,
        }
        // HERE I WANT TO RECEIVE file.txt file2.txt
    }
}
fn main() {
    let mut flag = Flag::new();
    flag.fill_flag();
}

Я использую бета-версию clap для создания файла yaml для управления флагами.

файл yaml:

name: bs-script
version: "1.0.0"
author: Clement B. <[email protected]>
about: Write perform, secure and easy script with an Rust script interpretor
args:
  - debug:
      short: d
      long: debug
      about: display debug information

person Rayder-_-    schedule 29.12.2020    source источник


Ответы (1)


Чтобы аргумент принимал значения от нуля до многих, вам просто нужно указать multiple: true.

- files:
    multiple: true

Затем для получения файлов используйте _ 3_ вместе с collect::<Vec<&str>>() :

if let Some(files) = matches.values_of("files") {
    let files = files.collect::<Vec<_>>();

    println!("{:?}", files);
}

// Prints nothing                     for `cargo run -- -d`
// Prints `["file.txt"]`              for `cargo run -- file.txt -d`
// Prints `["file.txt", "read2.txt"]` for `cargo run -- file.txt read2.txt -d`

Вот полный cli.yaml:

name: bs-script
version: "1.0.0"
author: Clement B. <[email protected]>
about: Write perform, secure and easy script with an Rust script interpretor
args:
  - files:
      multiple: true
      about: Files
  - debug:
      short: d
      long: debug
      about: display debug information
person vallentin    schedule 29.12.2020