45 lines
972 B
Go
45 lines
972 B
Go
package mediator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
type RequestHandler[TRequest any, TResponse any] interface {
|
|
Handle(ctx context.Context, request TRequest) (TResponse, error)
|
|
}
|
|
|
|
type Mediator struct {
|
|
handlers map[reflect.Type]interface{}
|
|
}
|
|
|
|
func NewMediator() *Mediator {
|
|
return &Mediator{
|
|
handlers: make(map[reflect.Type]interface{}),
|
|
}
|
|
}
|
|
|
|
func Register[TRequest any, TResponse any](m *Mediator, handler RequestHandler[TRequest, TResponse]) {
|
|
var req TRequest
|
|
t := reflect.TypeOf(req)
|
|
m.handlers[t] = handler
|
|
}
|
|
|
|
func Send[TRequest any, TResponse any](m *Mediator, ctx context.Context, request TRequest) (TResponse, error) {
|
|
t := reflect.TypeOf(request)
|
|
handler, ok := m.handlers[t]
|
|
if !ok {
|
|
var zero TResponse
|
|
return zero, fmt.Errorf("handler not found for %v", t)
|
|
}
|
|
|
|
h, ok := handler.(RequestHandler[TRequest, TResponse])
|
|
if !ok {
|
|
var zero TResponse
|
|
return zero, fmt.Errorf("handler type mismatch")
|
|
}
|
|
|
|
return h.Handle(ctx, request)
|
|
}
|