aboutsummaryrefslogtreecommitdiff
path: root/internal/cli/liturgy.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cli/liturgy.go')
-rw-r--r--internal/cli/liturgy.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/internal/cli/liturgy.go b/internal/cli/liturgy.go
new file mode 100644
index 0000000..523531d
--- /dev/null
+++ b/internal/cli/liturgy.go
@@ -0,0 +1,84 @@
+package cli
+
+import (
+ "fmt"
+ "io"
+ "strings"
+ "time"
+
+ "github.com/lukaszkasprzak/lectio/internal/caldata"
+ "github.com/lukaszkasprzak/lectio/internal/calendar"
+ "github.com/lukaszkasprzak/lectio/internal/config"
+)
+
+// runLiturgy prints the computed liturgical day for date (default today) using
+// the offline calendar engine, and exits. It is the engine's demo/validation
+// surface; the daily-readings paths still use the scraper.
+func runLiturgy(cfg config.Config, date string, stdout, stderr io.Writer) int {
+ if date == "" {
+ date = today()
+ }
+ d, err := time.Parse("2006-01-02", date)
+ if err != nil {
+ fmt.Fprintf(stderr, "lectio: bad date %q (want YYYY-MM-DD)\n", date)
+ return 2
+ }
+ day := calendar.Compute(d.UTC(), cfg.Selection(), []calendar.Layer{caldata.Universal()})
+ printLiturgicalDay(stdout, cfg, day)
+ return 0
+}
+
+func printLiturgicalDay(out io.Writer, cfg config.Config, day calendar.LiturgicalDay) {
+ fmt.Fprintf(out, "%s %s\n", day.Date.Format("2006-01-02"), day.Weekday.String())
+ fmt.Fprintf(out, "season: %s (week %d · Sunday cycle %s · weekday cycle %s)\n",
+ day.Season, day.Week, day.SundayCycle, day.WeekdayCycle)
+ fmt.Fprintf(out, "observed: %s [%s · %s]\n", celebrationName(cfg, day.Observed), rankLabel(day.Observed.Rank), day.Colour)
+ for _, o := range day.Others {
+ if n := celebrationName(cfg, o); n != "" {
+ fmt.Fprintf(out, " also: %s [%s]\n", n, rankLabel(o.Rank))
+ }
+ }
+ for _, m := range day.Observed.Masses {
+ for _, r := range m.Readings {
+ label := r.Part
+ if m.Variant != "" {
+ label = m.Variant + " " + label
+ }
+ fmt.Fprintf(out, " %-16s %s\n", label+":", r.Citation)
+ }
+ }
+}
+
+// celebrationName is the celebration's name in the UI language (falling back to
+// English, then a humanized slug for temporal days that carry no proper name).
+func celebrationName(cfg config.Config, c calendar.Celebration) string {
+ lang := "en"
+ if cfg.UILanguage == "pl" {
+ lang = "pl"
+ }
+ if n := c.Name[lang]; n != "" {
+ return n
+ }
+ if n := c.Name["en"]; n != "" {
+ return n
+ }
+ if c.Slug == "" {
+ return "(feria)"
+ }
+ return strings.ReplaceAll(c.Slug, "-", " ")
+}
+
+func rankLabel(r calendar.Rank) string {
+ switch r {
+ case calendar.RankSolemnity:
+ return "solemnity"
+ case calendar.RankFeast:
+ return "feast"
+ case calendar.RankMemorial:
+ return "memorial"
+ case calendar.RankOptional:
+ return "optional memorial"
+ default:
+ return "feria"
+ }
+}