package main import ( _ "embed" "fmt" "html/template" "log" "net/http" "sync/atomic" ) //go:embed index.html var indexTemplate string var pageTemplate *template.Template var open atomic.Uint64 var done atomic.Uint64 func pageHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { w.WriteHeader(http.StatusNotFound) return } tempData := struct { Open uint64 Done uint64 IsAdmin bool }{open.Load(), done.Load() + 1, r.URL.Query().Has("admin")} if err := pageTemplate.Execute(w, tempData); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } func newHandler(w http.ResponseWriter, r *http.Request) { ticket := open.Add(1) log.Printf("Create ticket %d\n", ticket) if _, err := fmt.Fprintf(w, "%d", ticket); err != nil { log.Printf("Writing response failed: %v", err) } } func doneHandler(w http.ResponseWriter, r *http.Request) { ticket := done.Add(1) log.Printf("Finished ticket %d\n", ticket) if _, err := fmt.Fprintf(w, "%d", ticket); err != nil { log.Printf("Writing response failed: %v", err) } } func setupRoutes() { http.HandleFunc("/", pageHandler) http.HandleFunc("/new", newHandler) http.HandleFunc("/done", doneHandler) } func main() { setupRoutes() pageTemplate = template.Must(template.New("index").Parse(indexTemplate)) log.Printf("Serving http on %d", 8080) err := http.ListenAndServe(fmt.Sprintf(":%d", 8080), nil) log.Panicf("Serving http failed with %s", err) }