Глобальный флаг 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
Здесь есть две основные проблемы:
debug
флаг, а также призыв кinitialize_logger
дублируется в каждой подкомандеdebug
Флаг должен быть передан после подкоманды при вызове команды:my-cli hello world -debug
вместоmy-cli -debug hello world
Есть ли чистый способ справиться с этим Core.Command
API?