summaryrefslogtreecommitdiff
path: root/internal/server/ctxkeys
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-07-03 20:46:29 +0300
committerKyren223 <Kyren223@proton.me>2025-07-03 20:46:29 +0300
commit2d1408598ada38cb51412efe74b7c64466cb9057 (patch)
treef87a4909ff3eb224d24e244f69cb07d44d00c099 /internal/server/ctxkeys
parent635db98044c4bdf1d9badc0e24ce2db461d83c75 (diff)
Added ctxkeys package to better handle addition context when logging and
partially integrated it with keys for user id and ip addr
Diffstat (limited to 'internal/server/ctxkeys')
-rw-r--r--internal/server/ctxkeys/ctxkeys.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/server/ctxkeys/ctxkeys.go b/internal/server/ctxkeys/ctxkeys.go
new file mode 100644
index 0000000..c0f688d
--- /dev/null
+++ b/internal/server/ctxkeys/ctxkeys.go
@@ -0,0 +1,51 @@
+package ctxkeys
+
+import (
+ "context"
+ "log/slog"
+
+ "github.com/kyren223/eko/pkg/assert"
+)
+
+type key int
+
+const (
+ UserID key = iota
+ IpAddr
+ KeyMax
+)
+
+var keyNames = map[key]string{
+ UserID: "user_id",
+ IpAddr: "ip_addr",
+}
+
+func Init() {
+ assert.Assert(len(keyNames) == int(KeyMax), "Keys in keyNames mismatch amount of keys", "len(keyNames)", len(keyNames), "KeyMax", int(KeyMax))
+}
+
+func WithValue(ctx context.Context, k key, v any) context.Context {
+ return context.WithValue(ctx, k, v)
+}
+
+func Value(ctx context.Context, k key) any {
+ return ctx.Value(k)
+}
+
+type ContextHandler struct {
+ slog.Handler
+}
+
+func WrapLogHandler(baseHandler slog.Handler) *ContextHandler {
+ return &ContextHandler{Handler: baseHandler}
+}
+
+func (h *ContextHandler) Handle(ctx context.Context, r slog.Record) error {
+ for k := key(0); k < KeyMax; k++ {
+ if v := Value(ctx, k); v != nil {
+ r.AddAttrs(slog.Any(keyNames[k], v))
+ }
+ }
+
+ return h.Handler.Handle(ctx, r)
+}