Deadly simple router
package main
import (
"github.com/zelenin/go-router"
"log"
"net/http"
"io/fs"
"embed"
)
//go:embed dist
var UiAssets embed.FS
func main() {
rtr := router.New()
rtr.Pipe(logger)
uiFs, err := fs.Sub(UiAssets, "dist")
if err != nil {
log.Fatalf("Failed to open ui: %v", err)
}
rtr.FileServerFS("/", uiFs)
rtr.HandleFunc("GET /ping", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("pong"))
})
rtr.Group("/api/", func(subRouter *router.Router) {
subRouter.Group("/posts/", func(subRouter *router.Router) {
subRouter.Handle(`GET /{id}`, postHandler{})
})
})
server := &http.Server{
Addr: ":8080",
Handler: rtr,
}
err := server.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}
type postHandler struct{}
func (handler postHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
id := req.PathValue("id")
res.Write([]byte("id: " + id))
}
func logger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("[logger] Connection from %s", r.RemoteAddr)
next.ServeHTTP(w, r)
})
}
- WIP. Library API can be changed in the future
Aleksandr Zelenin, e-mail: [email protected]