package serverevents import ( "fmt" di "git.apihub24.de/admin/generic-di" "sync" ) func init() { di.Injectable(newEventHandlerRegistration) } type IEventHandlerRegistration interface { Add(eventType string, creator func() IEventHandler) GetHandler(eventType string) (IEventHandler, error) } type eventHandlerRegistration struct { creators map[string]func() IEventHandler instances map[string]IEventHandler mutex sync.RWMutex } func newEventHandlerRegistration() IEventHandlerRegistration { return &eventHandlerRegistration{ creators: make(map[string]func() IEventHandler), instances: make(map[string]IEventHandler), mutex: sync.RWMutex{}, } } func (registration *eventHandlerRegistration) Add(eventType string, creator func() IEventHandler) { registration.mutex.Lock() defer registration.mutex.Unlock() if _, ok := registration.instances[eventType]; ok { delete(registration.instances, eventType) } if _, ok := registration.creators[eventType]; ok { delete(registration.creators, eventType) } registration.creators[eventType] = creator } func (registration *eventHandlerRegistration) GetHandler(eventType string) (IEventHandler, error) { registration.mutex.RLock() defer registration.mutex.RUnlock() if creator, ok := registration.creators[eventType]; ok { if instance, ok := registration.instances[eventType]; ok { return instance, nil } registration.instances[eventType] = creator() return registration.instances[eventType], nil } return nil, fmt.Errorf("no instance of IEventHandler registered for Event %s! please call Registration Add in a init function to register your EventHandler", eventType) }