pkg/main.go

86 lines
1.8 KiB
Go
Raw Normal View History

2022-03-24 23:25:02 +03:00
package main
import (
"context"
"encoding/json"
"html/template"
2024-04-06 20:06:43 +03:00
"log/slog"
2022-03-24 23:25:02 +03:00
"net/http"
"os"
"os/signal"
2024-04-06 20:06:43 +03:00
"gitrepo.ru/neonxp/middleware"
2022-03-24 23:25:02 +03:00
)
var (
2024-04-06 20:06:43 +03:00
templates = template.Must(template.ParseFS(tplFS, "tpl/*.gohtml"))
2022-03-24 23:25:02 +03:00
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 {
2024-04-06 20:06:43 +03:00
panic(err)
2022-03-24 23:25:02 +03:00
}
if err := json.NewDecoder(fp).Decode(cfg); err != nil {
2024-04-06 20:06:43 +03:00
panic(err)
2022-03-24 23:25:02 +03:00
}
2024-04-06 20:06:43 +03:00
mux := http.NewServeMux()
2022-03-24 23:25:02 +03:00
2024-04-06 20:06:43 +03:00
mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
2022-03-24 23:25:02 +03:00
w.WriteHeader(http.StatusOK)
templates.ExecuteTemplate(w, "index.gohtml", indexRenderContext{
Title: cfg.Title,
Packages: cfg.Packages,
Host: cfg.Host,
Doc: "//pkg.go.dev/",
})
})
2024-04-06 20:06:43 +03:00
mux.HandleFunc("GET /{pkg}", func(w http.ResponseWriter, r *http.Request) {
pkgID := r.PathValue("pkg")
2022-03-24 23:25:02 +03:00
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/",
})
})
2024-04-06 20:06:43 +03:00
mux.Handle("GET /static/", http.FileServerFS(staticFS))
2022-03-24 23:25:02 +03:00
2024-04-06 20:06:43 +03:00
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}))
h := middleware.Logger(mux, logger)
h = middleware.Recover(h, logger)
h = middleware.RequestID(h)
2022-03-24 23:25:02 +03:00
srv := &http.Server{
2024-04-06 20:06:43 +03:00
Handler: h,
2022-03-24 23:25:02 +03:00
Addr: addr,
}
go func() {
<-ctx.Done()
srv.Shutdown(context.Background())
}()
2024-04-06 20:06:43 +03:00
logger.Info("server started", slog.String("bind", addr))
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
panic(err)
2022-03-24 23:25:02 +03:00
}
}