diff --git a/storage/message/message.go b/storage/message/message.go index 39cf5b0..781f463 100644 --- a/storage/message/message.go +++ b/storage/message/message.go @@ -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 diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index ddb07d8..e1819b5 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -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) {