Command-line and Emacs Calendar Client
1open Cmdliner
2
3let list_cmd = List_cmd.cmd
4let search_cmd = Search_cmd.cmd
5let show_cmd = Show_cmd.cmd
6let add_cmd = Add_cmd.cmd
7let delete_cmd = Delete_cmd.cmd
8let edit_cmd = Edit_cmd.cmd
9let server_cmd = Server_cmd.cmd
10let doc = "Command-line calendar tool for managing local .ics files"
11let version = "%%VERSION%%"
12
13let main env =
14 let exit_info =
15 [
16 Cmd.Exit.info ~doc:"on success." 0;
17 Cmd.Exit.info
18 ~doc:
19 "on error (including invalid date format, file access issues, or \
20 other errors)."
21 1;
22 ]
23 in
24 let info = Cmd.info "caled" ~version ~doc ~exits:exit_info in
25 let default =
26 Term.(ret (const (fun () -> `Help (`Pager, None)) $ const ()))
27 in
28 let calendar_dir_path =
29 match Sys.getenv_opt "CALENDAR_DIR" with
30 | Some dir -> dir
31 | None -> Filename.concat (Sys.getenv "HOME") ".calendar"
32 in
33 let fs = Eio.Stdenv.fs env in
34 match Caledonia_lib.Calendar_dir.create ~fs calendar_dir_path with
35 | Error (`Msg e) ->
36 Printf.eprintf "%s" e;
37 1
38 | Ok calendar_dir -> (
39 match
40 Cmd.eval_value
41 (Cmd.group info ~default
42 [
43 list_cmd ~fs calendar_dir;
44 search_cmd ~fs calendar_dir;
45 show_cmd ~fs calendar_dir;
46 add_cmd ~fs calendar_dir;
47 edit_cmd ~fs calendar_dir;
48 delete_cmd ~fs calendar_dir;
49 server_cmd ~stdin:(Eio.Stdenv.stdin env)
50 ~stdout:(Eio.Stdenv.stdout env) ~fs calendar_dir;
51 ])
52 with
53 | Ok (`Ok f) -> f ()
54 | Ok _ -> 0
55 | Error _ -> 1)
56
57let () = Eio_main.run @@ fun env -> exit (main env)