From bb43d4803a8764d63be6f7d6307fdd65e7a12677 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Fri, 8 Aug 2025 19:16:44 -0300 Subject: [PATCH] feat!(smalltrip,router): log handler type name and package on Handle and HandleFunc --- smalltrip/smalltrip.go | 47 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/smalltrip/smalltrip.go b/smalltrip/smalltrip.go index d5ddcd4..f34e513 100644 --- a/smalltrip/smalltrip.go +++ b/smalltrip/smalltrip.go @@ -20,6 +20,8 @@ import ( "io" "log/slog" "net/http" + "reflect" + "runtime" "forge.capytal.company/loreddev/x/smalltrip/middleware" "forge.capytal.company/loreddev/x/smalltrip/multiplexer" @@ -53,15 +55,25 @@ func NewRouter(options ...Option) Router { } func (router *router) HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) { - router.Handle(pattern, http.HandlerFunc(handler)) + log := router.log.With(slog.String("pattern", pattern), slog.String("handler", getValueType(handler))) + log.Info("Adding route") + + var hf http.Handler = http.HandlerFunc(handler) + + for _, m := range router.mws { + log.Debug("Wrapping with middleware", slog.String("middleware", getValueType(m))) + hf = m(hf) + } + + router.mux.Handle(pattern, hf) } func (router *router) Handle(pattern string, handler http.Handler) { - log := router.log.With(slog.String("pattern", pattern), slog.String("handler", fmt.Sprintf("%T", handler))) + log := router.log.With(slog.String("pattern", pattern), slog.String("handler", getValueType(handler))) log.Info("Adding route") for _, m := range router.mws { - log.Debug("Wrapping with middleware", slog.String("middleware", fmt.Sprintf("%T", m))) + log.Debug("Wrapping with middleware", slog.String("middleware", getValueType(m))) handler = m(handler) } @@ -69,7 +81,7 @@ func (router *router) Handle(pattern string, handler http.Handler) { } func (router *router) Use(m middleware.Middleware) { - router.log.Info("Middleware added", slog.String("middleware", fmt.Sprintf("%T", m))) + router.log.Info("Middleware added", slog.String("middleware", getValueType(m))) if router.mws == nil { router.mws = []middleware.Middleware{} @@ -84,3 +96,30 @@ func (router *router) Handler(r *http.Request) (http.Handler, string) { func (router *router) ServeHTTP(w http.ResponseWriter, r *http.Request) { router.mux.ServeHTTP(w, r) } + +func getValueType[T any](value T) (name string) { + defer func() { + if rc := recover(); rc != nil { + name = fmt.Sprintf("%T", value) + } + }() + + v := reflect.ValueOf(value) + + if v.Kind() == reflect.Pointer { + return getValueType(v.Elem().Interface()) + } + + if v.Kind() == reflect.Func { + fc := runtime.FuncForPC(v.Pointer()) + if fc != nil { + return fc.Name() + } + } + + if p, n := v.Type().PkgPath(), v.Type().Name(); p != "" && n != "" { + return fmt.Sprintf("%s.%s", p, n) + } + + return fmt.Sprintf("%T", value) +}