server_events/v2/registration.go

57 lines
1.5 KiB
Go

package serverevents
import (
"fmt"
"sync"
di "git.apihub24.de/admin/generic-di"
)
func init() {
di.Injectable(newEventHandlerRegistration)
}
type IEventHandlerRegistration interface {
Use(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) Use(creator func() IEventHandler) {
registration.mutex.Lock()
defer registration.mutex.Unlock()
tmp := creator()
eventType := tmp.GetConnectedEventName()
delete(registration.instances, eventType)
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)
}