OCaml Core.Command

时间:2018-04-12 12:02:55

标签: ocaml ocaml-core

我目前正在OCaml中创建一个CLI应用程序,并使用Core.Command({3}}中包含的CLI解析器来解析命令行。

我希望有一个可用于任何子命令的全局标志(例如git中的--paginate--git-dir标志)。

例如,我想要一个-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. 调用命令时,{/ 1}}标志需要在子命令之后传递debug而不是my-cli hello world -debug
  3. 使用my-cli -debug hello world API处理此问题是否有一种干净的方式?

0 个答案:

没有答案