57 lines
1.5 KiB
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)
|
|
}
|