package main import ( "context" "encoding/json" "html/template" "log/slog" "net/http" "os" "os/signal" "gitrepo.ru/neonxp/middleware" ) var ( templates = template.Must(template.ParseFS(tplFS, "tpl/*.gohtml")) packages = Packages{} ) func main() { addr := os.Getenv("ADDR") if addr == "" { addr = ":8080" } ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) defer cancel() cfg := &Config{} fp, err := os.Open("./config.json") if err != nil { panic(err) } if err := json.NewDecoder(fp).Decode(cfg); err != nil { panic(err) } mux := http.NewServeMux() mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) templates.ExecuteTemplate(w, "index.gohtml", indexRenderContext{ Title: cfg.Title, Packages: cfg.Packages, Host: cfg.Host, Doc: "//pkg.go.dev/", }) }) mux.HandleFunc("GET /{pkg}", func(w http.ResponseWriter, r *http.Request) { pkgID := r.PathValue("pkg") pkg, ok := (*cfg.Packages)[pkgID] if !ok { w.WriteHeader(http.StatusNotFound) return } w.WriteHeader(http.StatusOK) templates.ExecuteTemplate(w, "package.gohtml", pageRenderContext{ Title: cfg.Title, Package: &pkg, Host: cfg.Host, Doc: "//pkg.go.dev/", }) }) mux.Handle("GET /static/", http.FileServerFS(staticFS)) logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{})) h := middleware.Logger(mux, logger) h = middleware.Recover(h, logger) h = middleware.RequestID(h) srv := &http.Server{ Handler: h, Addr: addr, } go func() { <-ctx.Done() srv.Shutdown(context.Background()) }() logger.Info("server started", slog.String("bind", addr)) if err := srv.ListenAndServe(); err != http.ErrServerClosed { panic(err) } }