From 88d1caa038520b05da425fb2174ec42ee749f7ab Mon Sep 17 00:00:00 2001 From: Antonio Pagano Date: Mon, 17 Nov 2025 10:24:06 -0500 Subject: [PATCH] task: tweaking from_ctx a bit --- render/fromctx.go | 10 +++++++--- server/option.go | 7 +++++-- server/valuer.go | 25 ++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/render/fromctx.go b/render/fromctx.go index f03469d..d543d50 100644 --- a/render/fromctx.go +++ b/render/fromctx.go @@ -12,19 +12,23 @@ func FromCtx(ctx context.Context) *Page { page := ctx.Value("renderer").(*Page) // Setting values from the valuer in the page - vlr, ok := ctx.Value("valuer").(interface{ Values() map[string]any }) + type vlr interface { + Values() map[string]any + } + + vlx, ok := ctx.Value("valuer").(vlr) if !ok { return page } - for k, v := range vlr.Values() { + for k, v := range vlx.Values() { page.Set(k, v) } return page } -// FromCtx returns the render engine from the context, +// EngineFromCtx returns the render engine from the context, // it assumes the render render engine has been set // by the render middleware. func EngineFromCtx(ctx context.Context) *Engine { diff --git a/server/option.go b/server/option.go index 6998a45..5e1a750 100644 --- a/server/option.go +++ b/server/option.go @@ -8,7 +8,7 @@ import ( "go.leapkit.dev/core/server/session" ) -// Options for the server +// Option for the server type Option func(*mux) // WithHost allows to specify the host to run the server at @@ -46,7 +46,10 @@ func WithAssets(embedded fs.FS, servingPath string) Option { return func(m *mux) { m.Use(func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if vlr, ok := r.Context().Value("valuer").(interface{ Set(string, any) }); ok { + // finding the valuer from the context + vlr := ValuerFromContext(r.Context()) + if vlr != nil { + vlr.Set("assetManager", manager) vlr.Set("assetPath", manager.PathFor) vlr.Set("importMap", manager.ImportMap) } diff --git a/server/valuer.go b/server/valuer.go index 79b89bf..dde1abd 100644 --- a/server/valuer.go +++ b/server/valuer.go @@ -6,6 +6,29 @@ import ( "sync" ) +const ( + valuerContextKey = "valuer" +) + +// Valuer interface to store and retrieve values from the request context +// these values can be used by other components such as the render engine +// or the assets manager. +type Valuer interface { + Values() map[string]any + Value(string) any + Set(string, any) +} + +// ValuerFromContext retrieves the Valuer from the context. +func ValuerFromContext(ctx context.Context) Valuer { + vlr, ok := ctx.Value(valuerContextKey).(Valuer) + if !ok { + return nil + } + + return vlr +} + // values is a map where we can store values for the request context // these values will then be available for other components such as // the render engine. @@ -45,7 +68,7 @@ func setValuer(next http.Handler) http.Handler { }, } - r = r.WithContext(context.WithValue(r.Context(), "valuer", vlr)) + r = r.WithContext(context.WithValue(r.Context(), valuerContextKey, vlr)) next.ServeHTTP(w, r) }) }