diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-03 23:59:09 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-03 23:59:09 +0200 |
| commit | 27ceffcb90c0716179342109163c559d492a8abc (patch) | |
| tree | fe34486e7cf7bbb4f49d624512fb3782c29cc319 /mobile/mobile.go | |
| parent | 13d5e99ab90ab872c8cc072a0246348f0d24fa9a (diff) | |
| download | lectio-27ceffcb90c0716179342109163c559d492a8abc.tar.gz lectio-27ceffcb90c0716179342109163c559d492a8abc.zip | |
mobile: add Days, a text-free week projection for the calendar
A week through Days benchmarks at ~9-10ms/op, versus ~23ms for seven
full days through Day.
Diffstat (limited to 'mobile/mobile.go')
| -rw-r--r-- | mobile/mobile.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/mobile/mobile.go b/mobile/mobile.go index 6312ee0..e79e748 100644 --- a/mobile/mobile.go +++ b/mobile/mobile.go @@ -14,6 +14,7 @@ package mobile import ( "encoding/json" "strings" + "time" "github.com/lukaszkasprzak/lectio/internal/config" "github.com/lukaszkasprzak/lectio/internal/i18n" @@ -112,6 +113,77 @@ func Day(date, form, version, lang string) string { return string(b) } +// summaryPart is one section of a day, citation only -- no rendered text. +type summaryPart struct { + Part string `json:"part"` + Citation string `json:"citation"` +} + +// daySummary is one day's identity and its reading citations. It is Day's +// cheaper projection: the calendar view needs the day's shape, not its text. +type daySummary struct { + Date string `json:"date"` + Name string `json:"name"` + Rank string `json:"rank"` + RankLabel string `json:"rank_label"` + Colour string `json:"colour"` + Parts []summaryPart `json:"parts"` + Error string `json:"error,omitempty"` +} + +// Days returns count consecutive days from start as a JSON array, each with its +// identity and reading citations but no reading text. It is the calendar view's +// source. +// +// start - "YYYY-MM-DD", taken literally: aligning to a week is the caller's job +// count - 1..366; anything else yields "[]" +// form - "of" or "ef" +// lang - interface language for the name, rank word and citation dialect +// +// No version parameter: the corpus decides only scripture text, which this never +// renders, while the citation's sigla dialect follows lang. +// +// A day that fails to compute carries its own "error" and does not abort the +// rest, so one bad date cannot blank a whole week. Malformed input yields "[]" +// rather than an error string, so the caller always parses an array. +func Days(start string, count int, form, lang string) string { + if count < 1 || count > 366 { + return "[]" + } + d, err := time.Parse("2006-01-02", start) + if err != nil { + return "[]" + } + lect := lectByForm(form) + ui := i18n.Get(lang) + cfg := config.Config{UILanguage: lang, Lectionary: lect, All: true} + + out := make([]daySummary, 0, count) + for i := 0; i < count; i++ { + date := d.AddDate(0, 0, i).Format("2006-01-02") + row := daySummary{Date: date, Parts: []summaryPart{}} + secs, info, err := readings.Load(cfg, readings.Options{Date: date, All: true}) + if err != nil { + row.Error = err.Error() + } else { + row.Name = info.Name + row.Colour = info.Colour + row.Rank = info.Rank + row.RankLabel = ui.Rank[info.Rank] + for _, sec := range secs { + row.Parts = append(row.Parts, summaryPart{Part: sec.PartID, Citation: sec.Citation}) + } + } + out = append(out, row) + } + + b, err := json.Marshal(out) + if err != nil { + return "[]" + } + return string(b) +} + // Ping is a trivial JNI smoke test: it returns "pong" so the app can confirm the // native engine loaded before issuing a real query. func Ping() string { return "pong" } |
