// kjv-api: the King James Bible web API as one program plus one SQLite // database (kjv.db) that holds the text, every page and asset, user data and // the logs. package main import ( "flag" "fmt" "os" "path/filepath" "kjv-api/internal/kjv" ) const usage = `usage: kjv-api [-db kjv.db] [-addr 127.0.0.1:1611] run the server kjv-api import-assets [-db kjv.db] DIR load the pages, scripts, styles and data files from the assets folder into the database kjv-api logs [-db kjv.db] [-n 100] print the newest log lines stored in the database ` func findDB(flagValue string) string { if flagValue != "" { return flagValue } if v := os.Getenv("KJV_DB"); v != "" { return v } candidates := []string{"kjv.db"} if exe, err := os.Executable(); err == nil { candidates = append(candidates, filepath.Join(filepath.Dir(exe), "kjv.db")) } for _, c := range candidates { if _, err := os.Stat(c); err == nil { return c } } return "kjv.db" } func main() { args := os.Args[1:] if len(args) > 0 { switch args[0] { case "import-assets": fs := flag.NewFlagSet("import-assets", flag.ExitOnError) db := fs.String("db", "", "path to kjv.db") fs.Parse(args[1:]) if fs.NArg() != 1 { fmt.Fprint(os.Stderr, usage) os.Exit(2) } dbPath := findDB(*db) if _, err := os.Stat(dbPath); err != nil { fatal(err) } if err := kjv.ImportAssets(dbPath, fs.Arg(0)); err != nil { fatal(err) } return case "logs": fs := flag.NewFlagSet("logs", flag.ExitOnError) db := fs.String("db", "", "path to kjv.db") n := fs.Int("n", 100, "number of lines") fs.Parse(args[1:]) if err := kjv.ShowLogs(findDB(*db), *n); err != nil { fatal(err) } return case "help", "-h", "--help": fmt.Print(usage) return } } fs := flag.NewFlagSet("kjv-api", flag.ExitOnError) dbFlag := fs.String("db", "", "path to kjv.db (default: $KJV_DB, ./kjv.db, next to the program)") addr := fs.String("addr", envOr("KJV_ADDR", "127.0.0.1:1611"), "listen address (localhost only)") fs.Parse(args) if err := kjv.Run(findDB(*dbFlag), *addr); err != nil { fatal(err) } } func fatal(err error) { fmt.Fprintln(os.Stderr, "kjv-api:", err) os.Exit(1) } func envOr(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def }