// +build embed package web import ( "embed" "io" "io/fs" "net/http" "path/filepath" "strings" ) //go:embed frontend/dist var static embed.FS func (s *Server) IndexHandler(frontendDir string) http.HandlerFunc { dir, err := fs.Sub(static, "frontend/dist") if err != nil { panic(err) } fileSrv := http.FileServer(http.FS(dir)) fn := func(w http.ResponseWriter, r *http.Request) { path := strings.TrimPrefix(r.URL.Path, "/") _, err := dir.Open(path) if err != nil { serveIndex(frontendDir).ServeHTTP(w, r) return } fileSrv.ServeHTTP(w, r) } return http.HandlerFunc(fn) } func serveIndex(frontendDir string) http.HandlerFunc { dir, err := fs.Sub(static, "frontend/dist") if err != nil { panic(err) } fn := func(w http.ResponseWriter, r *http.Request) { fname := filepath.Join("index.html") f, err := dir.Open(fname) if err != nil { panic(err) } defer f.Close() io.Copy(w, f) } return fn }