storage: Add a more generic API
This commit is contained in:
parent
82bfc15057
commit
f277b9f062
2 changed files with 49 additions and 13 deletions
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/sql"
|
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/sql"
|
||||||
"github.com/FAU-CDI/wisski-distillery/internal/models"
|
"github.com/FAU-CDI/wisski-distillery/internal/models"
|
||||||
|
"github.com/tkw1536/goprogram/lib/collection"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -176,3 +177,42 @@ func (s Storage) Purge() error {
|
||||||
}
|
}
|
||||||
return nil
|
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))
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package mstore
|
||||||
import (
|
import (
|
||||||
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/meta"
|
"github.com/FAU-CDI/wisski-distillery/internal/dis/component/meta"
|
||||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient"
|
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient"
|
||||||
"github.com/tkw1536/goprogram/lib/collection"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MStore implements metadata storage for this WissKI
|
// MStore implements metadata storage for this WissKI
|
||||||
|
|
@ -13,29 +12,26 @@ type MStore struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// For is a Store for the provided value
|
// 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) {
|
func (f For[Value]) Get(m *MStore) (value Value, err error) {
|
||||||
err = m.Storage.Get(meta.Key(f), &value)
|
return meta.TypedKey[Value](f).Get(m.Storage)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f For[Value]) GetAll(m *MStore) (values []Value, err error) {
|
func (f For[Value]) GetAll(m *MStore) (values []Value, err error) {
|
||||||
err = m.Storage.GetAll(meta.Key(f), func(index, total int) any {
|
return meta.TypedKey[Value](f).GetAll(m.Storage)
|
||||||
if values == nil {
|
}
|
||||||
values = make([]Value, total)
|
|
||||||
}
|
func (f For[Value]) GetOrSet(m *MStore, dflt Value) (value Value, err error) {
|
||||||
return &values[index]
|
return meta.TypedKey[Value](f).GetOrSet(m.Storage, dflt)
|
||||||
})
|
|
||||||
return values, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f For[Value]) Set(m *MStore, value Value) error {
|
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 {
|
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 {
|
func (f For[Value]) Delete(m *MStore) error {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue