Source file config_handler.ml
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
let load_config_exn ~filename =
let contents = In_channel.read_all filename in
match Parsexp.Many_and_positions.parse_string contents with
| Error parse_error ->
let position = Parsexp.Parse_error.position parse_error in
let message = Parsexp.Parse_error.message parse_error in
let loc =
Sexp_handler.loc_of_parsexp_range
~filename
{ start_pos = position; end_pos = position }
in
Err.raise ~loc [ Pp.text message ]
| Ok (sexps, positions) ->
(match Dunolint.Config.of_stanzas sexps with
| t -> t
| exception Sexp.Of_sexp_error (exn, sub) ->
let range =
match Parsexp.Positions.find_sub_sexp_in_list_phys positions sexps ~sub with
| Some _ as range -> range
| None -> None [@coverage off]
in
let loc =
match range with
| Some range -> Sexp_handler.loc_of_parsexp_range ~filename range
| None -> Loc.of_file ~path:(Fpath.v filename) [@coverage off]
in
let message =
match exn with
| Failure str ->
Pp.text (if String.is_suffix str ~suffix:"." then str else str ^ ".")
| exn -> Err.exn exn [@coverage off]
in
Err.raise ~loc [ message ])
;;