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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
let main =
Command.make
~summary:"Lint project."
(let open Command.Std in
let+ dunolint_engine_config = Dunolint_engine.Config.arg
and+ () = Log_cli.set_config ()
and+ config =
Arg.named_opt [ "config" ] Param.file ~doc:"Path to dunolint config file."
and+ below = Common_helpers.below ~doc:"Lint only below this path."
and+ enforce =
Arg.named_multi
[ "enforce" ]
(Common_helpers.sexpable_param (module Dunolint.Condition))
~docv:"COND"
~doc:"Add condition to enforce."
>>| List.map ~f:(fun condition -> `enforce condition)
in
let config =
match config with
| Some config ->
let contents = In_channel.read_all config in
Parsexp.Conv_single.parse_string_exn contents Dunolint.Config.t_of_sexp
| None ->
Dunolint.Config.create
~skip_subtree:(Common_helpers.skip_subtree ~globs:[])
~rules:[]
()
in
let config =
Dunolint.Config.create
?skip_subtree:(Dunolint.Config.skip_subtree config)
~rules:(Dunolint.Config.rules config @ enforce)
()
in
Dunolint_engine.run ~config:dunolint_engine_config
@@ fun dunolint_engine ->
Dunolint_engine.visit
dunolint_engine
?below
~f:(fun ~parent_dir ~subdirectories:_ ~files ->
Linter.visit_directory ~dunolint_engine ~config ~parent_dir ~files))
;;