From 96c07bab1086510a55a004e9a1b90c30bc723a5c Mon Sep 17 00:00:00 2001 From: sangtran Date: Sat, 29 Aug 2026 01:08:28 +0700 Subject: feat: init base draft support window --- core/state_backend.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core/state_backend.go (limited to 'core/state_backend.go') diff --git a/core/state_backend.go b/core/state_backend.go new file mode 100644 index 0000000..9f9f397 --- /dev/null +++ b/core/state_backend.go @@ -0,0 +1,62 @@ +package core + +import ( + "context" +) + +type StateBackend interface { + // For Framework === + // SetCurrentKey will perform in Memory + SetCurrentKey(key string) error + // GetCurrentKey will perform in Memory + GetCurrentKey() string + SetCurrentNamespace(namespace any) error + GetCurrentNamespace() any + + // For User === + // GetValueState will perform in disk + GetValueState(ctx context.Context, key string) (ValueState[any], error) +} + +type stateBackendKeyType struct{} + +var stateBackendKey stateBackendKeyType + +type typedValueState[T any] struct { + inner ValueState[any] +} + +func CastValueType[T any](inner ValueState[any]) ValueState[T] { + return &typedValueState[T]{inner: inner} +} + +func (s *typedValueState[T]) Value(ctx context.Context) (T, error) { + val, err := s.inner.Value(ctx) + if err != nil { + var zero T + return zero, err + } + if val == nil { + var zero T + return zero, nil + } + return val.(T), nil +} + +func (s *typedValueState[T]) Update(ctx context.Context, newVal T) (T, error) { + _, err := s.inner.Update(ctx, newVal) + return newVal, err +} + +func (s *typedValueState[T]) Clear(ctx context.Context) error { + return s.inner.Clear(ctx) +} + +func InjectStateBackend(ctx context.Context, state StateBackend) context.Context { + return context.WithValue(ctx, stateBackendKey, state) +} + +func ExtractStateBackend(ctx context.Context) (StateBackend, bool) { + backend, ok := ctx.Value(stateBackendKey).(StateBackend) + return backend, ok +} -- cgit v1.3.1