a mood-tracker for myself
at main 48 lines 1.6 kB view raw
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