this repo has no description
at main 59 lines 1.6 kB view raw
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)