Есть ли какой-нибудь простой способ для Clap отображать справку, когда не указана никакая команда?

Я использую ящик Clap для анализа параметров командной строки. Я определил подкоманду ls, которая должна выводить список файлов. Clap также определяет подкоманду help, которая отображает информацию о приложении и его использовании.

Если команда не указана, вообще ничего не отображается, но я хочу, чтобы в этом случае приложение отображало справку.

Я пробовал этот код, который выглядит довольно простым, но не работает:

extern crate clap;

use clap::{App, SubCommand};

fn main() {
    let mut app = App::new("myapp")
        .version("0.0.1")
        .about("My first CLI APP")
        .subcommand(SubCommand::with_name("ls").about("List anything"));
    let matches = app.get_matches();

    if let Some(cmd) = matches.subcommand_name() {
        match cmd {
            "ls" => println!("List something here"),
            _ => eprintln!("unknown command"),
        }
    } else {
        app.print_long_help();
    }
}

Я получаю сообщение об ошибке app после перемещения:

error[E0382]: use of moved value: `app`
  --> src/main.rs:18:9
   |
10 |     let matches = app.get_matches();
   |                   --- value moved here
...
18 |         app.print_long_help();
   |         ^^^ value used here after move
   |
   = note: move occurs because `app` has type `clap::App<'_, '_>`, which does not implement the `Copy` trait

Читая документацию по Clap, я обнаружил, что clap::ArgMatches, возвращаемый в get_matches(), имеет метод _ 8_, которое возвращает строку для части использования, но, к сожалению, только эту часть и ничего больше.


person rpeshkov    schedule 15.03.2018    source источник


Ответы (1)


Используйте clap::AppSettings::ArgRequiredElseHelp:

App::new("myprog")
    .setting(AppSettings::ArgRequiredElseHelp)

Смотрите также:

person Shepmaster    schedule 15.03.2018
comment
спасибо за Ваш ответ. Отлично работает! Также спасибо за соответствующий ответ. Нашел там много полезной информации. - person rpeshkov; 15.03.2018
comment
Просто обратите внимание, что: Setting Arg::default_value эффективно отключает эту опцию, поскольку это гарантирует, что какой-то аргумент всегда присутствует. SubcommandRequiredElseHelp может быть лучшим вариантом для некоторых приложений. - person Ondrej Slinták; 23.06.2019