server_events/v2/registration.go
2025-07-06 21:28:31 +02:00

58 lines
1.6 KiB
Go

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)
}