Command-line and Emacs Calendar Client
1type filter = Event.t -> bool
2
3let text_matches pattern text =
4 let re = Re.Pcre.regexp ~flags:[ `CASELESS ] (Re.Pcre.quote pattern) in
5 Re.Pcre.pmatch ~rex:re text
6
7let summary_contains text event =
8 match Event.get_summary event with
9 | Some summary -> text_matches text summary
10 | None -> false
11
12let description_contains text event =
13 match Event.get_description event with
14 | Some desc -> text_matches text desc
15 | None -> false
16
17let location_contains text event =
18 match Event.get_location event with
19 | Some loc -> text_matches text loc
20 | None -> false
21
22let in_collections ids event =
23 let id = Event.get_collection event in
24 List.exists (fun col -> col = id) ids
25
26let recurring_only () event = Event.get_recurrence event <> None
27let non_recurring_only () event = Event.get_recurrence event = None
28let with_id id event = Event.get_id event = id
29let and_filter filters event = List.for_all (fun filter -> filter event) filters
30let or_filter filters event = List.exists (fun filter -> filter event) filters
31let not_filter filter event = not (filter event)
32let matches_filter event filter = filter event
33
34let query_events ~fs calendar_dir ?filter ?(comparator = Event.by_start) ?limit
35 () =
36 let ( let* ) = Result.bind in
37 let* collections = Calendar_dir.get_collections ~fs calendar_dir in
38 let events =
39 List.flatten (List.map (fun (_collection, events) -> events) collections)
40 in
41 let filtered_events =
42 match filter with Some f -> List.filter f events | None -> events
43 in
44 let sorted_events = List.sort comparator filtered_events in
45 Ok
46 (match limit with
47 | Some n when n > 0 ->
48 let rec take n lst acc =
49 match (lst, n) with
50 | _, 0 -> List.rev acc
51 | [], _ -> List.rev acc
52 | x :: xs, n -> take (n - 1) xs (x :: acc)
53 in
54 take n sorted_events []
55 | _ -> sorted_events)
56
57let query ~fs calendar_dir ?filter ~from ~to_
58 ?(comparator = Recur.Instance.by_start) ?limit () =
59 Fmt.epr "Querying from %a to %a\n%!" Ptime.pp (Option.get from) Ptime.pp to_;
60 match query_events ~fs calendar_dir ?filter () with
61 | Ok events ->
62 let instances =
63 List.concat_map
64 (fun event -> Recur.expand_event event ~from ~to_)
65 events
66 in
67 let sorted_instances = List.sort comparator instances in
68 Ok
69 (match limit with
70 | Some n when n > 0 ->
71 let rec take n lst acc =
72 match (lst, n) with
73 | _, 0 -> List.rev acc
74 | [], _ -> List.rev acc
75 | x :: xs, n -> take (n - 1) xs (x :: acc)
76 in
77 take n sorted_instances []
78 | _ -> sorted_instances)
79 | Error e -> Error e