this repo has no description
1open Sexplib0
2
3type deps = { packages : string list; libraries : string list }
4
5type t = { deps : deps }
6
7let empty = { deps = { libraries = []; packages = [] } }
8
9module Ast = struct
10 type item = Libraries of string list | Packages of string list
11
12 type t = item list
13end
14
15let parse_string_list sexps =
16 List.filter_map (function Sexp.Atom s -> Some s | _ -> None) sexps
17
18let parse_entry (sexp : Sexp.t) =
19 match sexp with
20 | Atom _ -> None
21 | List (Atom "libraries" :: libraries) ->
22 Some (Ast.Libraries (parse_string_list libraries))
23 | List (Atom "packages" :: pkgs) ->
24 Some (Ast.Packages (parse_string_list pkgs))
25 | _ -> None
26
27let of_ast (ast : Ast.t) =
28 let libs, pkgs =
29 List.fold_left
30 (fun (libs, pkgs) item ->
31 match item with
32 | Ast.Libraries l -> (l :: libs, pkgs)
33 | Ast.Packages l -> (libs, l :: pkgs))
34 ([], []) ast
35 in
36 let libraries, packages =
37 let f x = x |> List.concat |> List.sort_uniq String.compare in
38 (f libs, f pkgs)
39 in
40 { deps = { libraries; packages } }
41
42let parse s =
43 let entries = Sexplib.Sexp.of_string_many s in
44 let ast = List.filter_map parse_entry entries in
45 of_ast ast
46
47let load config_file =
48 match Bos.OS.File.read config_file with
49 | Error _ ->
50 Logs.err (fun m ->
51 m "Failed to read odoc-config file: %a" Fpath.pp config_file);
52 empty
53 | Ok s -> (
54 try parse s
55 with e ->
56 Logs.err (fun m ->
57 m "Failed to parse config file %a: %s" Fpath.pp config_file
58 (Printexc.to_string e));
59 empty)