50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
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
|
|
}
|