-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhooks.go
More file actions
132 lines (106 loc) · 3.85 KB
/
hooks.go
File metadata and controls
132 lines (106 loc) · 3.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package starmap
import (
"reflect"
"sync"
"github.com/agentstation/starmap/pkg/catalogs"
)
// Compile-time interface check to ensure proper implementation.
var _ Hooks = (*hooks)(nil)
// Hooks provides event callback registration for catalog changes.
type Hooks interface {
// OnModelAdded registers a callback for when models are added
OnModelAdded(ModelAddedHook)
// OnModelUpdated registers a callback for when models are updated
OnModelUpdated(ModelUpdatedHook)
// OnModelRemoved registers a callback for when models are removed
OnModelRemoved(ModelRemovedHook)
}
// Hook function types for model events.
type (
// ModelAddedHook is called when a model is added to the catalog.
ModelAddedHook func(model catalogs.Model)
// ModelUpdatedHook is called when a model is updated in the catalog.
ModelUpdatedHook func(old, updated catalogs.Model)
// ModelRemovedHook is called when a model is removed from the catalog.
ModelRemovedHook func(model catalogs.Model)
)
// OnModelAdded registers a callback for when models are added.
func (c *client) OnModelAdded(fn ModelAddedHook) { c.hooks.OnModelAdded(fn) }
// OnModelUpdated registers a callback for when models are updated.
func (c *client) OnModelUpdated(fn ModelUpdatedHook) { c.hooks.OnModelUpdated(fn) }
// OnModelRemoved registers a callback for when models are removed.
func (c *client) OnModelRemoved(fn ModelRemovedHook) { c.hooks.OnModelRemoved(fn) }
// hooks manages event callbacks for catalog changes.
type hooks struct {
mu sync.RWMutex
modelAdded []ModelAddedHook
modelUpdated []ModelUpdatedHook
modelRemoved []ModelRemovedHook
}
// newHooks creates a new hooks instance.
func newHooks() *hooks { return &hooks{} }
// OnModelAdded is a hook that registers a callback for when models are added.
func (h *hooks) OnModelAdded(fn ModelAddedHook) { h.onModelAdded(fn) }
// OnModelUpdated is a hook that registers a callback for when models are updated.
func (h *hooks) OnModelUpdated(fn ModelUpdatedHook) { h.onModelUpdated(fn) }
// OnModelRemoved is a hook that registers a callback for when models are removed.
func (h *hooks) OnModelRemoved(fn ModelRemovedHook) { h.onModelRemoved(fn) }
// onModelAdded registers a callback for when models are added.
func (h *hooks) onModelAdded(fn ModelAddedHook) {
h.mu.Lock()
h.modelAdded = append(h.modelAdded, fn)
h.mu.Unlock()
}
// onModelUpdated registers a callback for when models are updated.
func (h *hooks) onModelUpdated(fn ModelUpdatedHook) {
h.mu.Lock()
h.modelUpdated = append(h.modelUpdated, fn)
h.mu.Unlock()
}
// onModelRemoved registers a callback for when models are removed.
func (h *hooks) onModelRemoved(fn ModelRemovedHook) {
h.mu.Lock()
h.modelRemoved = append(h.modelRemoved, fn)
h.mu.Unlock()
}
// triggerUpdate compares old and new catalogs and triggers appropriate hooks.
func (h *hooks) triggerUpdate(old, updated catalogs.Reader) {
h.mu.RLock()
defer h.mu.RUnlock()
// Get old and new models for comparison
oldModels := old.Models().List()
newModels := updated.Models().List()
// Create maps for efficient lookup
oldModelMap := make(map[string]catalogs.Model)
for _, model := range oldModels {
oldModelMap[model.ID] = model
}
newModelMap := make(map[string]catalogs.Model)
for _, model := range newModels {
newModelMap[model.ID] = model
}
// Detect changes and trigger hooks
for _, newModel := range newModels {
if oldModel, exists := oldModelMap[newModel.ID]; exists {
// Check if model was updated
if !reflect.DeepEqual(oldModel, newModel) {
for _, hook := range h.modelUpdated {
hook(oldModel, newModel)
}
}
} else {
// Model was added
for _, hook := range h.modelAdded {
hook(newModel)
}
}
}
// Check for removed models
for _, oldModel := range oldModels {
if _, exists := newModelMap[oldModel.ID]; !exists {
for _, hook := range h.modelRemoved {
hook(oldModel)
}
}
}
}