Picocli: как всегда показывать заголовок / баннер - PullRequest
0 голосов
/ 22 октября 2018

Picocli предлагает возможность добавить красивый заголовок в аннотацию @Command, например:

@Command(name = "git-star", header = {
    "@|green       _ _      _             |@", 
    "@|green  __ _(_) |_ __| |_ __ _ _ _  |@",
    "@|green / _` | |  _(_-<  _/ _` | '_| |@",
    "@|green \\__, |_|\\__/__/\\__\\__,_|_|   |@",
    "@|green |___/                        |@"},
    description = "Shows GitHub stars for a project",
    mixinStandardHelpOptions = true, version = "git-star 0.1")

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

(см. также https://github.com/remkop/picocli/issues/517)

1 Ответ

0 голосов
/ 22 октября 2018

Это имеет два аспекта:

  • Как получить текст баннера из приложения?
  • Как отобразить цвета и стили ANSI?

Вы можете получить баннер из справочного сообщения об использовании, либо с помощью new CommandLine(new App()).getCommandSpec().usageHelpMessage().header(), либо введя аннотированное поле CommandSpec *1011* в свое приложение.

Чтобы отобразить стили ANSI, используйте CommandLine.Help.Ansi.AUTO.string(line) для каждой строки баннера.

Собираем все вместе:

@Command(name = "git-star", header = {
        "@|green       _ _      _             |@", 
        "@|green  __ _(_) |_ __| |_ __ _ _ _  |@",
        "@|green / _` | |  _(_-<  _/ _` | '_| |@",
        "@|green \\__, |_|\\__/__/\\__\\__,_|_|   |@",
        "@|green |___/                        |@"},
        description = "Shows GitHub stars for a project",
        mixinStandardHelpOptions = true, version = "git-star 0.1")
class GitStar implements Runnable {

  @Option(names = "-c")
  int count;

  @Spec CommandSpec spec;

  // prints banner every time the command is invoked
  public void run() {

    String[] banner = new CommandLine(new GitStar())
            .getCommandSpec().usageHelpMessage().header();

    // or: String[] banner = this.spec.usageHelpMessage().header();

    for (String line : banner) {
      System.out.println(CommandLine.Help.Ansi.AUTO.string(line));
    }

    // business logic here...
  }

  public static void main(String[] args) {
    CommandLine.run(new GitStar(), args);
  }
}
...