a mood-tracker for myself
1open Core
2open Mood
3
4let mood_file =
5 let home = Fpath.v @@ Sys_unix.home_directory () in
6 let f = Fpath.v ".mood" in
7 Fpath.(to_string (home // f))
8
9let parse_date d =
10 let now = Date.of_time (Time_float.now ()) ~zone:Time_float.Zone.utc in
11 match d with
12 | "yesterday" | "y" -> Date.add_days now (-1)
13 | "daybefore" | "db" -> Date.add_days now (-2)
14 | d -> Date.of_string d
15
16let record =
17 Command.basic ~summary:"record a mood"
18 (let%map_open.Command value = anon ("value" %: int)
19 and d = anon (maybe ("date" %: string)) in
20 fun () ->
21 Tracker.load mood_file
22 |> Tracker.record
23 ?day:(Option.map ~f:parse_date d)
24 ~mood:(Val.of_int value)
25 |> Tracker.store ~location:mood_file)
26
27let show =
28 Command.basic ~summary:"show this year's mood graph"
29 (let%map_open.Command () = return () in
30 fun () -> Tracker.load mood_file |> Tracker.render |> Stdio.print_endline)
31
32let get =
33 Command.basic ~summary:"get today's mood"
34 (let%map_open.Command () = return () in
35 fun () ->
36 Tracker.load mood_file |> Tracker.today |> fun (_, v) ->
37 Option.value_map ~default:"" ~f:Val.to_string v |> Stdio.print_endline)
38
39let random =
40 Command.basic ~summary:"render a randomly generated mood graph"
41 (let%map_open.Command () = return () in
42 fun () -> Tracker.random () |> Tracker.render |> Stdio.print_endline)
43
44let mood =
45 Command.group ~summary:"cli mood tracker; will this fad last? we shall see"
46 [ ("record", record); ("show", show); ("random", random); ("get", get) ]
47
48let () = Command_unix.run ~version:"1.0" ~build_info:"RWO" mood