package event import ( "errors" "reflect" ) type HandlerInst interface { Default(event any) (err error) } type OnStart struct{} type OnLoopCycle struct{} var HandlerDone = errors.New("handler done") func FindHandlers(inst HandlerInst) (handlers map[reflect.Type]reflect.Value) { handlers = make(map[reflect.Type]reflect.Value) t := reflect.TypeOf(inst) v := reflect.ValueOf(inst) for i := 0; i < t.NumMethod(); i++ { method := t.Method(i) if method.Type.NumIn() != 2 || method.Type.NumOut() != 1 { continue } if method.Type.Out(0) != reflect.TypeFor[error]() { continue } eventType := method.Type.In(1) handlers[eventType] = v.Method(i) } return } func Fire(inst HandlerInst, event any, handlers map[reflect.Type]reflect.Value) (err error) { if handler, ok := handlers[reflect.TypeOf(event)]; ok { errV := handler.Call([]reflect.Value{reflect.ValueOf(event)})[0] if !errV.IsNil() { err = errV.Interface().(error) } } else { err = inst.Default(event) } return }