package main import ( "embed" "fmt" "html/template" "io/fs" "net/http" "os" ) const PORT = 3003 type frontendInfo struct { Name, Mountpoint string } //go:embed "all:vuejs/dist" var vueFiles embed.FS //go:embed "all:reactNextJS/out" var nextFiles embed.FS //go:embed "all:svelte/dist" var svelteFiles embed.FS //go:embed "vanillaJS" var vanillaFiles embed.FS //go:embed "alpinejs" var alpineFiles embed.FS //go:embed "react" var reactFiles embed.FS func addFrontend(files embed.FS, mountpoint string, subfs string, name string) frontendInfo { subFiles, _ := fs.Sub(files, subfs) fileServer := http.FileServerFS(subFiles) http.Handle(mountpoint, http.StripPrefix(mountpoint, fileServer)) return frontendInfo{name, mountpoint} } func outputIndexAndExit(indexTemplate template.Template, frontends []frontendInfo) { file, err := os.OpenFile("index.html", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { panic(err) // Handle error } defer file.Close() indexTemplate.Execute(file, frontends) os.Exit(0) } func main() { args := os.Args home_template, err := template.ParseFiles("index.tmpl") if err != nil { panic(fmt.Sprintf("Error parsing homepage template\n%s", err)) } frontends := []frontendInfo{ addFrontend(vanillaFiles, "/vanillaJS/", "vanillaJS", "JS Only"), addFrontend(alpineFiles, "/alpinejs/", "alpinejs", "Alpine.js"), addFrontend(reactFiles, "/react/", "react", "React"), addFrontend(nextFiles, "/reactNextJS/", "reactNextJS/out", "React (Next.js)"), addFrontend(vueFiles, "/vuejs/", "vuejs/dist", "Vue.js"), addFrontend(svelteFiles, "/svelte/", "svelte/dist", "Svelte"), } if len(args) == 2 && args[1] == "generate" { outputIndexAndExit(*home_template, frontends) } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { err = home_template.Execute(w, frontends) }) err = http.ListenAndServe(fmt.Sprintf(":%d", PORT), nil) if err != nil { panic(fmt.Sprintf("Error starting server: %s", err)) } }