Source file global_config.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
56
57
58
59
open Sexplib0
type deps = { packages : string list; libraries : string list }
type t = { deps : deps }
let empty = { deps = { libraries = []; packages = [] } }
module Ast = struct
type item = Libraries of string list | Packages of string list
type t = item list
end
let parse_string_list sexps =
List.filter_map (function Sexp.Atom s -> Some s | _ -> None) sexps
let parse_entry (sexp : Sexp.t) =
match sexp with
| Atom _ -> None
| List (Atom "libraries" :: libraries) ->
Some (Ast.Libraries (parse_string_list libraries))
| List (Atom "packages" :: pkgs) ->
Some (Ast.Packages (parse_string_list pkgs))
| _ -> None
let of_ast (ast : Ast.t) =
let libs, pkgs =
List.fold_left
(fun (libs, pkgs) item ->
match item with
| Ast.Libraries l -> (l :: libs, pkgs)
| Ast.Packages l -> (libs, l :: pkgs))
([], []) ast
in
let libraries, packages =
let f x = x |> List.concat |> List.sort_uniq String.compare in
(f libs, f pkgs)
in
{ deps = { libraries; packages } }
let parse s =
let entries = Sexplib.Sexp.of_string_many s in
let ast = List.filter_map parse_entry entries in
of_ast ast
let load config_file =
match Bos.OS.File.read config_file with
| Error _ ->
Logs.err (fun m ->
m "Failed to read odoc-config file: %a" Fpath.pp config_file);
empty
| Ok s -> (
try parse s
with e ->
Logs.err (fun m ->
m "Failed to parse config file %a: %s" Fpath.pp config_file
(Printexc.to_string e));
empty)