provide some logic for controlling creation of Track adapters

This commit is contained in:
Helmut Merz 2024-05-02 09:54:41 +02:00
parent 25357b1cb1
commit 2181c628c0
2 changed files with 17 additions and 3 deletions

View file

@ -10,7 +10,7 @@ type message struct {
*tracking.Track
}
func Message(tr *tracking.Track) *message {
func Message(tr *tracking.Track) tracking.Adapted {
return &message{tr}
}
@ -19,7 +19,7 @@ func MakeMessage(c *tracking.Container, h ...string) *tracking.Track {
if h[0] == "" {
h[0] = "scopes"
}
return tracking.MakeTrack(c, h...)
return tracking.MakeTrack(c, h...).SetAdapterFactory(Message)
}
func (msg *message) Domain() string {
@ -33,7 +33,7 @@ func Messages(db *sql.Storage) *tracking.Container {
}
func New(cont *tracking.Container, h ...string) *message {
return Message(cont.NewTrack(h, nil))
return tracking.Adapt[*message](cont.NewTrack(h, nil))
}
// message store action handler

View file

@ -19,6 +19,9 @@ import (
type ContFactory func(*sql.Storage) *Container
type ItemFactory func(*Container, ...string) *Track
type Adapted interface{}
type AdapterFactory func(*Track) Adapted
// basic track implementation
type Track struct {
@ -27,6 +30,7 @@ type Track struct {
TimeStamp *time.Time
Data lib.Map
container *Container
adapter AdapterFactory
}
func (tr *Track) TrackId() lib.Ident {
@ -45,11 +49,21 @@ func MakeTrack(cont *Container, h ...string) *Track {
tr := Track{
Head: lib.StrMap{},
container: cont,
adapter: func(tr *Track) Adapted { return tr },
}
tr.SetHead(h...)
return &tr
}
func (tr *Track) SetAdapterFactory(af AdapterFactory) *Track {
tr.adapter = af
return tr
}
func Adapt[T Adapted](tr *Track) T {
return tr.adapter(tr).(T)
}
func (tr *Track) SetHead(h ...string) {
for i, k := range tr.container.HeadFields {
if i >= len(h) {