diff options
Diffstat (limited to 'lib/config.ml')
-rw-r--r-- | lib/config.ml | 88 |
1 files changed, 69 insertions, 19 deletions
diff --git a/lib/config.ml b/lib/config.ml index fb1fc88..ee0129c 100644 --- a/lib/config.ml +++ b/lib/config.ml @@ -1,26 +1,76 @@ -let config_file = "default_config.toml" +(* -*- mode: tuareg; -*- *) + +open Toml type t = { - repositories_root : string; user : string; default_branch : string; - max_commits_displayed : int; + 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 Toml.Parser.from_filename config_file with - | `Error (e, _) -> failwith ("Config parse error: " ^ e) - | `Ok table -> - let find key = Toml.Types.Table.find (Toml.Min.key key) table in - let find_string key = - match find key with TString s -> s | _ -> raise Not_found - in - let find_int key = - match find key with TInt i -> i | _ -> raise Not_found - in - { - repositories_root = find_string "repositories_root"; - user = find_string "user"; - default_branch = find_string "default_branch"; - max_commits_displayed = find_int "max_commits_displayed"; - } + match read_file ~file:config_file () with + | Ok cfg -> cfg + | Error err -> failwith err |