package processor import ( "fmt" "github.com/fox/fox/log" "github.com/fox/fox/timer" "reflect" ) type RegisterTimerMetas map[timer.ITimeType]any func NewTimerProcessor() *TimerProcessor { return &TimerProcessor{ delegates: make(map[timer.ITimeType]reflect.Value), } } type TimerProcessor struct { delegates map[timer.ITimeType]reflect.Value } func (h *TimerProcessor) RegisterMessages(metas RegisterTimerMetas) { for cmd, delegate := range metas { h.RegisterMessage(cmd, delegate) } } func (h *TimerProcessor) RegisterMessage(cmd timer.ITimeType, delegate any) { h.delegates[cmd] = reflect.ValueOf(delegate) log.DebugF("processor register message %v", cmd) } func (h *TimerProcessor) UnregisterMessage(cmd timer.ITimeType) { delete(h.delegates, cmd) log.DebugF("processor unregister message %v", cmd) } func (h *TimerProcessor) Dispatch(cmd timer.ITimeType, params ...any) error { in := make([]reflect.Value, len(params)) for i, param := range params { in[i] = reflect.ValueOf(param) } delegate, ok := h.delegates[cmd] if !ok { return fmt.Errorf("cmd %d delegates not found", cmd) } delegate.Call(in) return nil }