summaryrefslogtreecommitdiff
path: root/lib/config.ml
blob: ee0129ce140076887ff9c625fda689fb62f3ba86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
(* -*- 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
Copyright 2019--2025 Marius PETER