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

View file

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