summaryrefslogtreecommitdiff
path: root/lib/config.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/config.ml')
-rw-r--r--lib/config.ml88
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
Copyright 2019--2025 Marius PETER