frontends/server.go

83 lines
1.9 KiB
Go

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))
}
}