(* -*- mode: tuareg; -*- *) open Toml type t = { user : string; default_branch : string; git_project_root : string; commits_max_displayed : int; } let default = { user = Unix.getlogin (); default_branch = "master"; git_project_root = Filename.concat (Sys.getenv "HOME") "git.test"; commits_max_displayed = 10; } let locate_config_file () = match List.find_map Sys.getenv_opt [ "OGIT_CONFIG"; "XDG_CONFIG_HOME" ] with | Some file -> file | None -> "/etc/ogit/config.toml" let config_file = locate_config_file () 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); ("git_project_root", TString t.git_project_root); ("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 find_string key = match Types.Table.find_opt (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 Types.Table.find_opt (Min.key key) table with | Some (TInt i) -> Ok i | Some _ -> Error ("Expected int for key: " ^ key) | None -> Error ("Missing key: " ^ key) in let ( let* ) = Result.bind in let* git_project_root = find_string "git_project_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 { git_project_root; user; default_branch; commits_max_displayed } with _ -> prerr_endline "[config.ml] Falling back to default config."; Ok default let config = match read_file () with Ok cfg -> cfg | Error _ -> default