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