aboutsummaryrefslogtreecommitdiff
path: root/cmd/lectio-web/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/lectio-web/main.go')
-rw-r--r--cmd/lectio-web/main.go122
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
}