package web import ( "embed" "html/template" "io/fs" "net/http" ) //go:embed templates/*.html static/* var assets embed.FS type page struct { Title string } func NewHandler() http.Handler { tmpl := template.Must(template.ParseFS(assets, "templates/*.html")) staticFiles, err := fs.Sub(assets, "static") if err != nil { panic(err) } mux := http.NewServeMux() mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServerFS(staticFiles))) mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "text/plain; charset=utf-8") _, _ = w.Write([]byte("ok\n")) }) for path, title := range map[string]string{ "GET /{$}": "新着", "GET /queue": "待ち行列", "GET /subscriptions": "登録番組", "GET /library": "ライブラリ", } { mux.HandleFunc(path, func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tmpl.ExecuteTemplate(w, "layout", page{Title: title}); err != nil { http.Error(w, "template error", http.StatusInternalServerError) } }) } return mux }