From c1b954ad517cef00bf480d5229b253a8c6524be7 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 23 Jul 2026 23:45:07 +0200 Subject: cli-ui,web: real flag parsing for lectio-ui/lectio-web (accept useful flags, reject unknown, -h/-v) --- internal/cli/cli.go | 34 +++++++++++----------------------- internal/config/config.go | 24 ++++++++++++++++++++++++ internal/tui/tui.go | 23 ++++++++++++++++------- internal/tui/tui_test.go | 4 ++-- 4 files changed, 53 insertions(+), 32 deletions(-) (limited to 'internal') diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 720c165..c514607 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -20,9 +20,6 @@ import ( "github.com/lukaszkasprzak/lectio/internal/render" ) -// versionString is printed by --version/-v. -const versionString = "0.1.0" - const helpText = `lectio — daily Catholic liturgy readings (Polish + 4 versions) Usage: @@ -65,14 +62,6 @@ const ( var dateRe = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`) -var validVersions = map[string]bool{ - "pl": true, - "wuj": true, - "vul": true, - "grb": true, - "drb": true, -} - func today() string { return time.Now().Format("2006-01-02") } @@ -84,7 +73,7 @@ func Run(args []string, stdin io.Reader, stdout, stderr io.Writer) int { return 0 } if wantsVersion(args) { - fmt.Fprintln(stdout, "lectio "+versionString) + fmt.Fprintln(stdout, "lectio "+config.Version) return 0 } if len(args) > 0 && args[0] == "help" { @@ -179,7 +168,7 @@ func Run(args []string, stdin io.Reader, stdout, stderr io.Writer) int { return renderCompare(cfg, compareList, date, effAll, raw, effWidth, refresh, stdout, stderr) } if bibleVer != "" { - if !validVersions[bibleVer] { + if !config.ValidVersion(bibleVer) { fmt.Fprintf(stderr, "lectio: unknown version %q (want one of pl, wuj, vul, grb, drb)\n", bibleVer) return 2 } @@ -237,19 +226,18 @@ func extractDate(args []string) (date string, rest []string, err error) { // normalizeLectionary maps -l/--lectionary's accepted spellings ("new", // "trad", "traditional") onto the canonical config.Config.Lectionary values -// ("new", "traditional"); "" (flag not given) passes through unchanged so -// the caller knows to leave config's own setting alone. +// ("new", "traditional") via config.NormalizeLectionary; "" (flag not given) +// passes through unchanged so the caller knows to leave config's own +// setting alone. func normalizeLectionary(lectionary string) (string, error) { - switch lectionary { - case "": + if lectionary == "" { return "", nil - case "trad": - return "traditional", nil - case "new", "traditional": - return lectionary, nil - default: + } + v, ok := config.NormalizeLectionary(lectionary) + if !ok { return "", fmt.Errorf("invalid --lectionary %q (want new|trad)", lectionary) } + return v, nil } // runHarvest handles -u/--update: harvest sigla maximally (to the @@ -397,7 +385,7 @@ func renderCompare(cfg config.Config, list, date string, all, raw bool, width in } } for _, v := range versions { - if !validVersions[v] { + if !config.ValidVersion(v) { fmt.Fprintf(stderr, "lectio: unknown version %q (want one of pl, wuj, vul, grb, drb)\n", v) return 2 } diff --git a/internal/config/config.go b/internal/config/config.go index dd81544..7cef184 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -22,6 +22,10 @@ import ( //go:embed config.toml var seedTOML []byte +// Version is lectio's release version, shared by every binary's +// -v/--version output (lectio, lectio-ui, lectio-web). +const Version = "0.1.0" + // validVersions are the five scripture versions lectio understands. var validVersions = map[string]bool{ "pl": true, @@ -31,6 +35,26 @@ var validVersions = map[string]bool{ "drb": true, } +// ValidVersion reports whether v is one of the five scripture versions +// lectio understands (pl, wuj, vul, grb, drb). +func ValidVersion(v string) bool { + return validVersions[v] +} + +// NormalizeLectionary maps -l/--lectionary's accepted spellings ("new", +// "trad", "traditional") onto the canonical Config.Lectionary values ("new", +// "traditional"); anything else reports ok=false. +func NormalizeLectionary(s string) (string, bool) { + switch strings.ToLower(s) { + case "new": + return "new", true + case "trad", "traditional": + return "traditional", true + default: + return "", false + } +} + // validDisplays are the lectio-web reading-pane layouts. var validDisplays = map[string]bool{ "horizontal": true, diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 47314b6..16cb304 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -44,24 +44,33 @@ type errMsg struct { } // New builds the initial model: cfg.Offline drops "pl" from the version -// list (render.OfflineVersions), the active version starts at -// cfg.DefaultVersion (falling back to the first version if not found, or -// "" if there are none), and the date starts at today. The first fetch is -// issued by Init, not here. -func New(cfg config.Config) Model { +// list (render.OfflineVersions). startVersion selects the active version +// (falling back to cfg.DefaultVersion when ""), still resolved through +// EffectiveVersions/indexOf so an unavailable version falls back to index 0. +// startDate selects the starting date (falling back to today when ""). The +// first fetch is issued by Init, not here. +func New(cfg config.Config, startDate, startVersion string) Model { versions := render.EffectiveVersions(append([]string(nil), cfg.Versions...), cfg.Lectionary, cfg.Offline) - idx := indexOf(versions, cfg.DefaultVersion) + if startVersion == "" { + startVersion = cfg.DefaultVersion + } + idx := indexOf(versions, startVersion) if idx < 0 { idx = 0 } idx = clampIndex(idx, len(versions)) + date := startDate + if date == "" { + date = time.Now().Format("2006-01-02") + } + return Model{ cfg: cfg, versions: versions, verIdx: idx, - date: time.Now().Format("2006-01-02"), + date: date, loading: true, } } diff --git a/internal/tui/tui_test.go b/internal/tui/tui_test.go index 60b473b..2b966ee 100644 --- a/internal/tui/tui_test.go +++ b/internal/tui/tui_test.go @@ -10,7 +10,7 @@ import ( ) func TestVersionCycle(t *testing.T) { - m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl"}) + m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl"}, "", "") if m.version() != "pl" { t.Fatalf("start = %q", m.version()) } @@ -25,7 +25,7 @@ func TestVersionCycle(t *testing.T) { } func TestOfflineDropsPL(t *testing.T) { - m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl", Offline: true}) + m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl", Offline: true}, "", "") for _, v := range m.versions { if v == "pl" { t.Error("offline model kept pl") -- cgit v1.3