api/internal/endpoint/registration.go

48 lines
1.4 KiB
Go
Raw Normal View History

//go:generate mockgen -source=$GOFILE -destination=./../../internal/mock/endpoint/handler_registry.mock.go -package=endpoint_mock
package endpoint
import (
"fmt"
)
type Registration func(registry HandlerRegistry) error
type HandlerRegistry interface {
RegisterHandler(handlerRef HandlerReference, handlerProvider func() ProtocolHandler)
AvailableHandlers() []HandlerReference
HandlerForName(handlerRef HandlerReference) (ProtocolHandler, bool)
}
func NewHandlerRegistry() HandlerRegistry {
return &handlerRegistry{
handlers: make(map[HandlerReference]func() ProtocolHandler),
}
}
type handlerRegistry struct {
handlers map[HandlerReference]func() ProtocolHandler
}
func (h handlerRegistry) AvailableHandlers() (availableHandlers []HandlerReference) {
for s := range h.handlers {
availableHandlers = append(availableHandlers, s)
}
return
}
func (h *handlerRegistry) HandlerForName(handlerRef HandlerReference) (instance ProtocolHandler, ok bool) {
var provider func() ProtocolHandler
if provider, ok = h.handlers[handlerRef.ToLower()]; ok {
instance = provider()
}
return
}
func (h *handlerRegistry) RegisterHandler(handlerRef HandlerReference, handlerProvider func() ProtocolHandler) {
handlerRef = handlerRef.ToLower()
if _, exists := h.handlers[handlerRef]; exists {
panic(fmt.Sprintf("handler with name %s is already registered - there's something strange...in the neighborhood", handlerRef))
}
h.handlers[handlerRef] = handlerProvider
}