package main import ( "fmt" "io" "os" ) type Command interface { Name() string Init(args []string) error Run(stdin io.Reader, stdout io.Writer) error } func main() { if len(os.Args) < 2 { printHelp() os.Exit(1) } cmdName := os.Args[1] args := os.Args[2:] if cmdName == "help" || cmdName == "--help" || cmdName == "-h" { printHelp() os.Exit(0) } var cmd Command switch cmdName { case "scrape": cmd = &ScrapeCommand{} case "serve": cmd = &ServeCommand{} default: fmt.Fprintf(os.Stderr, "Unknown command: %s\n\n", cmdName) printHelp() os.Exit(1) } if err := cmd.Init(args); err != nil { fmt.Fprintf(os.Stderr, "Error initializing %s: %v\n", cmdName, err) os.Exit(1) } if err := cmd.Run(os.Stdin, os.Stdout); err != nil { fmt.Fprintf(os.Stderr, "Error running %s: %v\n", cmdName, err) os.Exit(1) } } func printHelp() { fmt.Printf(`abvjt [arguments] Journal abbreviation lookup service. Commands: scrape Scrape WOS journal abbreviations into SQLite DB serve Start HTTP server for web UI and API help Show this help message Usage: abvjt scrape --db data/abvjt.db abvjt serve --port 8080 --db data/abvjt.db `) }