Глобальный флаг CLI в OCaml Core.Command

В настоящее время я создаю приложение CLI в OCaml и использую Core.Commandсинтаксический анализатор CLI, включенный в ядро (v0.10), для анализа командной строки.

Я хочу иметь глобальный флаг, который можно использовать для любой подкоманды (например, --paginate или же --git-dir флаги в git например).

Например, я хочу -debug пометить, чтобы действовали две следующие команды

my-cli -debug hello world
my-cli -debug goodbye world

Тем не менее, я не мог найти способ сделать это с Core.Command API.

Вот упрощенная версия, которая у меня сейчас есть.

open Core

let initialize_logger debug =
  Logs.set_reporter (Logs_fmt.reporter ());
  let log_level = if debug then Logs.Debug else Logs.Info in
  Logs.set_level (Some log_level)

let some_func_with_logging () =
  Logs.debug (fun m -> m "the flag debug was passed!")

let hello name =
  some_func_with_logging ();
  Printf.printf "Hello %s!\n" name

let goodbye name =
  some_func_with_logging ();
  Printf.printf "Goodbye %s!\n" name

let hello_command = 
  let open Command.Let_syntax in
  Command.basic
    ~summary:"says hello"
    [%map_open
      let name = anon ("name" %: string)
      and debug = flag "debug" no_arg ~doc:"debug" in
      fun () ->
        initialize_logger debug;
        hello name
    ]

let goodbye_command =
  let open Command.Let_syntax in
  Command.basic
    ~summary:"says goodbye"
    [%map_open
      let name = anon ("name" %: string)
      and debug = flag "debug" no_arg ~doc:"debug" in
      fun () ->
        initialize_logger debug;
        goodbye name
    ]

let main_command =
  Command.group ~summary:"a cool CLI tool"
    [ ("hello", hello_command);
      ("goodbye", goodbye_command);
    ]

let () = Command.run main_command

Здесь есть две основные проблемы:

  1. debug флаг, а также призыв к initialize_logger дублируется в каждой подкоманде
  2. debug Флаг должен быть передан после подкоманды при вызове команды: my-cli hello world -debug вместо my-cli -debug hello world

Есть ли чистый способ справиться с этим Core.Command API?

0 ответов

Другие вопросы по тегам