package main import ( "encoding/json" "flag" "html/template" "io" "log" "net/http" "os" "git.brandonirizarry.xyz/adventure/internal/types" ) func main() { // Set up log flags. log.SetFlags(log.LstdFlags | log.Lshortfile) // Get any command-line flags (port, etc.) port := flag.String("port", "8080", "Server port") filename := flag.String("json", "adventure.json", "Adventure file (JSON)") flag.Parse() // Get the JSON. f, err := os.Open(*filename) if err != nil { log.Fatal(err) } defer f.Close() jsonBytes, err := io.ReadAll(f) if err != nil { log.Fatal(err) } var cfg types.Config if err := json.Unmarshal(jsonBytes, &cfg.Story); err != nil { log.Fatal(err) } // Set up all the templates needed for the story arcs. indexTmpl, err := template.ParseGlob("views/*.gohtml") if err != nil { log.Fatal(err) } cfg.Template = indexTmpl // Set up the handlers and server. mux := http.NewServeMux() mux.Handle("/{arc}", &cfg) mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static")))) log.Fatal(runServer(mux, *port)) } func runServer(h http.Handler, port string) error { srv := http.Server{ Addr: ":" + port, Handler: h, } log.Printf("Serving on port %s...\n", port) return srv.ListenAndServe() }