package processor import ( "fmt" "github.com/fox/fox/ipb" "github.com/fox/fox/log" ) type RpcHandler func(*ipb.InternalMsg) *ipb.InternalMsg func NewRpcProcessor() *RpcProcessor { return &RpcProcessor{ delegates: make(map[string]RpcHandler), } } type RpcProcessor struct { delegates map[string]RpcHandler } func (h *RpcProcessor) RegisterMessages(metas map[string]RpcHandler) { for cmd, handler := range metas { h.RegisterMessage(cmd, handler) } } func (h *RpcProcessor) RegisterMessage(cmd string, delegate RpcHandler) { h.delegates[cmd] = delegate log.DebugF("processor register message %v", cmd) } func (h *RpcProcessor) UnregisterMessage(cmd string) { delete(h.delegates, cmd) log.DebugF("processor unregister message %v", cmd) } func (h *RpcProcessor) Dispatch(cmd string, msg *ipb.InternalMsg) (*ipb.InternalMsg, error) { delegate, ok := h.delegates[cmd] if !ok { return nil, fmt.Errorf("cmd %v delegates not found", cmd) } return delegate(msg), nil }