Фикс шаблонов и кода

This commit is contained in:
Alexander NeonXP Kiryukhin 2024-04-06 20:06:43 +03:00
parent 8a71e6d273
commit 3b6d0dbe8c
Signed by: NeonXP
GPG key ID: 35E33E1AB7776B39
3 changed files with 28 additions and 46 deletions

9
fs.go Normal file
View file

@ -0,0 +1,9 @@
package main
import "embed"
//go:embed static/*
var staticFS embed.FS
//go:embed tpl/*
var tplFS embed.FS

2
go.mod
View file

@ -1,5 +1,5 @@
module go.neonxp.dev/pkg module go.neonxp.dev/pkg
go 1.18 go 1.22
require github.com/go-chi/chi/v5 v5.0.7 require github.com/go-chi/chi/v5 v5.0.7

63
main.go
View file

@ -4,19 +4,16 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"html/template" "html/template"
"log" "log/slog"
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"path/filepath"
"strings"
"github.com/go-chi/chi/v5" "gitrepo.ru/neonxp/middleware"
"github.com/go-chi/chi/v5/middleware"
) )
var ( var (
templates = template.Must(template.ParseGlob("./tpl/*.gohtml")) templates = template.Must(template.ParseFS(tplFS, "tpl/*.gohtml"))
packages = Packages{} packages = Packages{}
) )
@ -32,21 +29,15 @@ func main() {
fp, err := os.Open("./config.json") fp, err := os.Open("./config.json")
if err != nil { if err != nil {
log.Fatal(err) panic(err)
} }
if err := json.NewDecoder(fp).Decode(cfg); err != nil { if err := json.NewDecoder(fp).Decode(cfg); err != nil {
log.Fatal(err) panic(err)
} }
r := chi.NewRouter() mux := http.NewServeMux()
r.Use(middleware.RequestID) mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
r.Use(middleware.StripSlashes)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
templates.ExecuteTemplate(w, "index.gohtml", indexRenderContext{ templates.ExecuteTemplate(w, "index.gohtml", indexRenderContext{
Title: cfg.Title, Title: cfg.Title,
@ -56,8 +47,8 @@ func main() {
}) })
}) })
r.Get("/{pkg}", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("GET /{pkg}", func(w http.ResponseWriter, r *http.Request) {
pkgID := chi.URLParam(r, "pkg") pkgID := r.PathValue("pkg")
pkg, ok := (*cfg.Packages)[pkgID] pkg, ok := (*cfg.Packages)[pkgID]
if !ok { if !ok {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
@ -71,42 +62,24 @@ func main() {
Doc: "//pkg.go.dev/", Doc: "//pkg.go.dev/",
}) })
}) })
mux.Handle("GET /static/", http.FileServerFS(staticFS))
workDir, _ := os.Getwd() logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}))
filesDir := http.Dir(filepath.Join(workDir, "static")) h := middleware.Logger(mux, logger)
FileServer(r, "/static", filesDir) h = middleware.Recover(h, logger)
h = middleware.RequestID(h)
srv := &http.Server{ srv := &http.Server{
Handler: r, Handler: h,
Addr: addr, Addr: addr,
} }
go func() { go func() {
<-ctx.Done() <-ctx.Done()
srv.Shutdown(context.Background()) srv.Shutdown(context.Background())
}() }()
log.Println("Start at", addr)
logger.Info("server started", slog.String("bind", addr))
if err := srv.ListenAndServe(); err != http.ErrServerClosed { if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err) panic(err)
} }
} }
// FileServer conveniently sets up a http.FileServer handler to serve
// static files from a http.FileSystem.
func FileServer(r chi.Router, path string, root http.FileSystem) {
if strings.ContainsAny(path, "{}*") {
panic("FileServer does not permit any URL parameters.")
}
if path != "/" && path[len(path)-1] != '/' {
r.Get(path, http.RedirectHandler(path+"/", 301).ServeHTTP)
path += "/"
}
path += "*"
r.Get(path, func(w http.ResponseWriter, r *http.Request) {
rctx := chi.RouteContext(r.Context())
pathPrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*")
fs := http.StripPrefix(pathPrefix, http.FileServer(root))
fs.ServeHTTP(w, r)
})
}