From f277b9f0622938bde15fe884da2e0917d729258d Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Thu, 24 Nov 2022 10:43:20 +0100 Subject: [PATCH] storage: Add a more generic API --- internal/dis/component/meta/storage.go | 40 +++++++++++++++++++++ internal/wisski/ingredient/mstore/mstore.go | 22 +++++------- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/internal/dis/component/meta/storage.go b/internal/dis/component/meta/storage.go index 1267940..095603b 100644 --- a/internal/dis/component/meta/storage.go +++ b/internal/dis/component/meta/storage.go @@ -6,6 +6,7 @@ import ( "github.com/FAU-CDI/wisski-distillery/internal/dis/component/sql" "github.com/FAU-CDI/wisski-distillery/internal/models" + "github.com/tkw1536/goprogram/lib/collection" "gorm.io/gorm" ) @@ -176,3 +177,42 @@ func (s Storage) Purge() error { } return nil } + +// TypedKey represents a convenience wrapper for a given with a given value. +type TypedKey[Value any] Key + +func (f TypedKey[Value]) Get(s *Storage) (value Value, err error) { + err = s.Get(Key(f), &value) + return +} + +func (f TypedKey[Value]) GetOrSet(s *Storage, dflt Value) (value Value, err error) { + value, err = f.Get(s) + if err == ErrMetadatumNotSet { + value = dflt + err = f.Set(s, value) + } + return +} + +func (f TypedKey[Value]) GetAll(m *Storage) (values []Value, err error) { + err = m.GetAll(Key(f), func(index, total int) any { + if values == nil { + values = make([]Value, total) + } + return &values[index] + }) + return values, err +} + +func (f TypedKey[Value]) Set(m *Storage, value Value) error { + return m.Set(Key(f), value) +} + +func (f TypedKey[Value]) SetAll(m *Storage, values ...Value) error { + return m.SetAll(Key(f), collection.AsAny(values)...) +} + +func (f TypedKey[Value]) Delete(m *Storage) error { + return m.Delete(Key(f)) +} diff --git a/internal/wisski/ingredient/mstore/mstore.go b/internal/wisski/ingredient/mstore/mstore.go index 31e9440..7f75cb8 100644 --- a/internal/wisski/ingredient/mstore/mstore.go +++ b/internal/wisski/ingredient/mstore/mstore.go @@ -3,7 +3,6 @@ package mstore import ( "github.com/FAU-CDI/wisski-distillery/internal/dis/component/meta" "github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient" - "github.com/tkw1536/goprogram/lib/collection" ) // MStore implements metadata storage for this WissKI @@ -13,29 +12,26 @@ type MStore struct { } // For is a Store for the provided value -type For[Value any] meta.Key +type For[Value any] meta.TypedKey[Value] func (f For[Value]) Get(m *MStore) (value Value, err error) { - err = m.Storage.Get(meta.Key(f), &value) - return + return meta.TypedKey[Value](f).Get(m.Storage) } func (f For[Value]) GetAll(m *MStore) (values []Value, err error) { - err = m.Storage.GetAll(meta.Key(f), func(index, total int) any { - if values == nil { - values = make([]Value, total) - } - return &values[index] - }) - return values, err + return meta.TypedKey[Value](f).GetAll(m.Storage) +} + +func (f For[Value]) GetOrSet(m *MStore, dflt Value) (value Value, err error) { + return meta.TypedKey[Value](f).GetOrSet(m.Storage, dflt) } func (f For[Value]) Set(m *MStore, value Value) error { - return m.Storage.Set(meta.Key(f), value) + return meta.TypedKey[Value](f).Set(m.Storage, value) } func (f For[Value]) SetAll(m *MStore, values ...Value) error { - return m.Storage.SetAll(meta.Key(f), collection.AsAny(values)...) + return meta.TypedKey[Value](f).SetAll(m.Storage, values...) } func (f For[Value]) Delete(m *MStore) error {