1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
open Cmdliner
let strf = Format.asprintf
let level ?env ?docs () =
let vopts =
let doc = "Increase verbosity. Repeatable, but more than twice does
not bring more."
in
Arg.(value & flag_all & info ["v"; "verbose"] ~doc ?docs)
in
let verbosity =
let enum =
[ "warning", None;
"quiet", Some None;
"error", Some (Some Logs.Error);
"warning", Some (Some Logs.Warning);
"info", Some (Some Logs.Info);
"debug", Some (Some Logs.Debug); ]
in
let log_level = Arg.enum enum in
let enum_alts = Arg.doc_alts_enum List.(tl enum) in
let doc = strf "Be more or less verbose. $(docv) must be %s. Takes over
$(b,-v)." enum_alts
in
Arg.(value & opt log_level None &
info ["verbosity"] ?env ~docv:"LEVEL" ~doc ?docs)
in
let quiet =
let doc = "Be quiet. Takes over $(b,-v) and $(b,--verbosity)." in
Arg.(value & flag & info ["q"; "quiet"] ~doc ?docs)
in
let choose quiet verbosity vopts =
if quiet then None else match verbosity with
| Some verbosity -> verbosity
| None ->
match List.length vopts with
| 0 -> Some Logs.Warning
| 1 -> Some Logs.Info
| n -> Some Logs.Debug
in
Term.(const choose $ quiet $ verbosity $ vopts)