(* -*- mode: tuareg; -*- *) open Toml type t = { user : string; default_branch : string; repositories_root_path : string; commits_max_displayed : int; } let default = { user = Unix.getlogin (); default_branch = "master"; repositories_root_path = Filename.concat (Sys.getenv "HOME") "git.test"; commits_max_displayed = 10; } let config_file = Filename.(concat current_dir_name "config.toml") let to_table t = let open Types in List.map (fun (k, v) -> (Min.key k, v)) [ ("user", TString t.user); ("default_branch", TString t.default_branch); ("repositories.root_path", TString t.repositories_root_path); ("commits.max_displayed", TInt t.commits_max_displayed); ] |> Min.of_key_values let write_file ?(file = config_file) table = let oc = open_out file in Printer.string_of_table table |> Printf.fprintf oc "%s\n"; close_out oc let read_file ?(file = config_file) () = try match Toml.Parser.from_filename file with | `Error (e, l) -> Error (Printf.sprintf "%s: %s at line %d" l.source e l.line) | `Ok table -> let ( let* ) = Result.bind in let find_string key = match Toml.Types.Table.find_opt (Toml.Min.key key) table with | Some (TString s) -> Ok s | Some _ -> Error ("Expected string for key: " ^ key) | None -> Error ("Missing key: " ^ key) in let find_int key = match Toml.Types.Table.find_opt (Toml.Min.key key) table with | Some (TInt i) -> Ok i | Some _ -> Error ("Expected int for key: " ^ key) | None -> Error ("Missing key: " ^ key) in let* repositories_root_path = find_string "repositories_root" in let* user = find_string "user" in let* default_branch = find_string "default_branch" in let* commits_max_displayed = find_int "max_commits_displayed" in Ok { repositories_root_path; user; default_branch; commits_max_displayed; } with _ -> prerr_endline "[config.ml] Falling back to default config."; Ok default let config = match read_file ~file:config_file () with | Ok cfg -> cfg | Error err -> failwith err