package main import ( "embed" "encoding/json" "flag" "fmt" "io/fs" "net/http" "runtime/debug" ) //go:embed dist/* var embeddedFiles embed.FS var buildInfoJSON []byte func main() { port := flag.Int("port", 8000, "Port to listen on") flag.Parse() frontend, err := fs.Sub(embeddedFiles, "dist") if err != nil { panic(err) } http.Handle("GET /", http.FileServer(http.FS(frontend))) initializeBuildInfoJSON() http.HandleFunc("GET /api/v1/version", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Write(buildInfoJSON) }) fmt.Printf("Serving on :%v\n", *port) panic(http.ListenAndServe(fmt.Sprintf(":%v", *port), nil)) } func initializeBuildInfoJSON() { rawBuildInfo, _ := debug.ReadBuildInfo() var revision, time string var dirty bool for _, buildSetting := range rawBuildInfo.Settings { if buildSetting.Key == "vcs.revision" { revision = buildSetting.Value } else if buildSetting.Key == "vcs.time" { time = buildSetting.Value } else if buildSetting.Key == "vcs.modified" { dirty = buildSetting.Value == "true" } } buildInfo := map[string]interface{}{ "GitRev": revision, "GitDirty": dirty, "GitTime": time, "GoVersion": rawBuildInfo.GoVersion, "AllBuildInfo": rawBuildInfo.String(), } var err error buildInfoJSON, err = json.Marshal(buildInfo) if err != nil { panic(err) } }