diff options
Diffstat (limited to 'cmd/lectio-web/main.go')
| -rw-r--r-- | cmd/lectio-web/main.go | 122 |
1 files changed, 118 insertions, 4 deletions
diff --git a/cmd/lectio-web/main.go b/cmd/lectio-web/main.go index 44845b8..2e7fa5a 100644 --- a/cmd/lectio-web/main.go +++ b/cmd/lectio-web/main.go @@ -1,21 +1,135 @@ +// Command lectio-web serves lectio's browser reading UI. package main import ( + "flag" "fmt" + "io" "os" "github.com/lukaszkasprzak/lectio/internal/config" "github.com/lukaszkasprzak/lectio/internal/web" ) +const helpText = `lectio-web — browser daily liturgy reader (Polish + 4 versions) + +Usage: + lectio-web [flags] + +Flags: + -p, --port N port (overrides web_port; 0 = auto) + -o, --offline cache/sigla only, no network + -l, --lectionary WHICH new|trad (trad -> traditional) + -g, --lang LANG traditional lectionary language: pl|en + -v, --version print the version and exit + -h, --help this help + +Flags override config. Exit codes: 0 ok, 1 runtime error, 2 usage error. +` + func main() { + os.Exit(run(os.Args[1:], os.Stdout, os.Stderr)) +} + +// run is lectio-web's testable entry point: parse args, validate, load +// config, apply overrides, and launch the server. Returns a process exit +// code. +func run(args []string, stdout, stderr io.Writer) int { + if wantsHelp(args) { + fmt.Fprint(stdout, helpText) + return 0 + } + if wantsVersion(args) { + fmt.Fprintln(stdout, "lectio-web "+config.Version) + return 0 + } + cfg, err := config.Load() if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + fmt.Fprintln(stderr, "lectio-web:", err) + return 1 } + + var offline bool + var port int + var lectionary, lang string + + fs := flag.NewFlagSet("lectio-web", flag.ContinueOnError) + fs.SetOutput(stderr) + fs.Usage = func() { fmt.Fprint(stderr, helpText) } + + fs.IntVar(&port, "p", cfg.WebPort, "port (overrides web_port; 0 = auto)") + fs.IntVar(&port, "port", cfg.WebPort, "port (overrides web_port; 0 = auto)") + fs.BoolVar(&offline, "o", cfg.Offline, "cache/sigla only, no network") + fs.BoolVar(&offline, "offline", cfg.Offline, "cache/sigla only, no network") + fs.StringVar(&lectionary, "l", "", "new|trad") + fs.StringVar(&lectionary, "lectionary", "", "new|trad") + fs.StringVar(&lang, "g", "", "pl|en") + fs.StringVar(&lang, "lang", "", "pl|en") + + if err := fs.Parse(args); err != nil { + return 2 + } + if fs.NArg() > 0 { + fmt.Fprintf(stderr, "lectio-web: unexpected argument %q; see 'lectio-web -h'\n", fs.Arg(0)) + return 2 + } + + lectionary, err = normalizeLectionary(lectionary) + if err != nil { + fmt.Fprintln(stderr, "lectio-web:", err) + return 2 + } + if lang != "" && lang != "pl" && lang != "en" { + fmt.Fprintf(stderr, "lectio-web: invalid --lang %q (want pl|en)\n", lang) + return 2 + } + + cfg.WebPort = port + cfg.Offline = offline + if lectionary != "" { + cfg.Lectionary = lectionary + } + if lang != "" { + cfg.TraditionalLang = lang + } + if err := web.Run(cfg); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) + fmt.Fprintln(stderr, err) + return 1 + } + return 0 +} + +// wantsHelp reports whether -h/--help appears anywhere in args. +func wantsHelp(args []string) bool { + for _, a := range args { + if a == "-h" || a == "--help" { + return true + } + } + return false +} + +// wantsVersion reports whether -v/--version appears anywhere in args. +func wantsVersion(args []string) bool { + for _, a := range args { + if a == "-v" || a == "--version" { + return true + } + } + return false +} + +// normalizeLectionary maps -l/--lectionary's accepted spellings via +// config.NormalizeLectionary; "" (flag not given) passes through unchanged. +func normalizeLectionary(lectionary string) (string, error) { + if lectionary == "" { + return "", nil + } + v, ok := config.NormalizeLectionary(lectionary) + if !ok { + return "", fmt.Errorf("invalid --lectionary %q (want new|trad)", lectionary) } + return v, nil } |
