2025-12-18 09:34:49 +08:00

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