58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package journal
|
|
|
|
import "sync"
|
|
|
|
// EventTypeRegistry is a component that constructs tracked EventType tokens,
|
|
// for usage with a Journal.
|
|
type EventTypeRegistry interface {
|
|
|
|
// RegisterEventType introduces a new event type to a journal, and
|
|
// returns an EventType token that components can later use to check whether
|
|
// journalling for that type is enabled/suppressed, and to tag journal
|
|
// entries appropriately.
|
|
RegisterEventType(system, event string) EventType
|
|
}
|
|
|
|
// eventTypeRegistry is an embeddable mixin that takes care of tracking disabled
|
|
// event types, and returning initialized/safe EventTypes when requested.
|
|
type eventTypeRegistry struct {
|
|
sync.Mutex
|
|
|
|
m map[string]EventType
|
|
}
|
|
|
|
var _ EventTypeRegistry = (*eventTypeRegistry)(nil)
|
|
|
|
func NewEventTypeRegistry(disabled DisabledEvents) EventTypeRegistry {
|
|
ret := &eventTypeRegistry{
|
|
m: make(map[string]EventType, len(disabled)+32), // + extra capacity.
|
|
}
|
|
|
|
for _, et := range disabled {
|
|
et.enabled, et.safe = false, true
|
|
ret.m[et.System+":"+et.Event] = et
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
func (d *eventTypeRegistry) RegisterEventType(system, event string) EventType {
|
|
d.Lock()
|
|
defer d.Unlock()
|
|
|
|
key := system + ":" + event
|
|
if et, ok := d.m[key]; ok {
|
|
return et
|
|
}
|
|
|
|
et := EventType{
|
|
System: system,
|
|
Event: event,
|
|
enabled: true,
|
|
safe: true,
|
|
}
|
|
|
|
d.m[key] = et
|
|
return et
|
|
}
|