aboutsummaryrefslogtreecommitdiff
path: root/lib/rites/rite_ef/lectionary_ef.ml
blob: f9ce9ab41e4772a635b6f402ffcf57f54e377198 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
open Colitur_kernel

(* [data/ef/lectionary.sexp] is located relative to the BUILD TREE, not the
   process's own cwd -- the same reasoning bin/main.ml's own [data_dir]
   documents at length: cwd varies with how the binary that eventually links
   this library is invoked (a user's shell for `dune exec colitur --`, a
   dune cram test's own sandboxed temp directory, `_build/default/test/` for
   `dune test`), and nothing in this project's build pins it to the
   repository root. [Sys.executable_name] resolves through /proc/self/exe on
   Linux, so it reports the executable's own canonical absolute path even
   when launched through a symlink (dune's cram sandbox places exactly one;
   confirmed working there already by bin/main.ml). Every executable that
   links this library -- bin/main.exe, test/test_colitur.exe,
   tools/*.exe -- sits exactly one directory below _build/default/, so
   climbing up twice and back down into data/ef always finds the file,
   regardless of the caller's own cwd. *)
let data_path () =
  Filename.dirname (Filename.dirname Sys.executable_name) ^ "/data/ef/lectionary.sexp"

(* Loaded once, at module initialisation: the data is year-independent and
   build_day is called 3 074 246 times over the full domain. *)
let lectionary =
  match Lectionary.load (data_path ()) with
  | Ok l -> l
  | Error e -> failwith ("lectionary_ef: " ^ e)

(* Step 1: the observed celebration's own proper.
   Step 2: the day's own temporal slug.

   Nothing here encodes "Lent has daily propers": the presence of an entry is
   the discriminator. Verified against lectio -- Lent 1 Monday returns its own
   Ezech 34:11-16, while Advent, Christmas and post-Pentecost Mondays return
   their Sunday's Mass. *)
let readings ~observed ~temporal ~date:_ ~temporal_at:_ =
  match observed.Celebration.citations with
  | _ :: _ as cs -> cs
  | [] -> (
      match Lectionary.find lectionary temporal.Temporal.office.Celebration.slug with
      | Some cs -> cs
      | None -> [])