From e2de681b71af23e595073fd2fda8e8a28eaa7954 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 8 Apr 2026 10:19:37 +0200 Subject: [PATCH] feat: add generic RememberValue[T] for type-safe keyvalue caching RememberValue uses GetWithValue() internally for proper gob-decoding, which is required when Redis is used as the keyvalue backend. --- pkg/modules/keyvalue/keyvalue.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pkg/modules/keyvalue/keyvalue.go b/pkg/modules/keyvalue/keyvalue.go index e6dbbfabd..87280a717 100644 --- a/pkg/modules/keyvalue/keyvalue.go +++ b/pkg/modules/keyvalue/keyvalue.go @@ -110,3 +110,31 @@ func Remember(key string, fn func() (any, error)) (any, error) { return val, nil } + +// RememberValue is a type-safe version of Remember that uses GetWithValue +// for proper deserialization (required for Redis gob-encoded values). +// T must be a concrete (non-pointer) type. +func RememberValue[T any](key string, fn func() (T, error)) (T, error) { + var cached T + exists, err := GetWithValue(key, &cached) + if err != nil { + var zero T + return zero, err + } + if exists { + return cached, nil + } + + val, err := fn() + if err != nil { + var zero T + return zero, err + } + + if err := Put(key, val); err != nil { + var zero T + return zero, err + } + + return val, nil +}