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