callback.go 1.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
package node

import (
	"github.com/eolinker/goku-api-gateway/admin/cmd"
)

type Callback func(code cmd.Code, data []byte) error

func (c Callback) ServerCode(code cmd.Code, data []byte) error {
	return c(code, data)
}

type CodeHandler interface {
	ServerCode(code cmd.Code, data []byte) error
}

//Register cmd 回调注册器
type Register struct {
	callbacks map[cmd.Code][]CodeHandler
}

//NewRegister create register
func NewRegister() *Register {
	return &Register{
		callbacks: make(map[cmd.Code][]CodeHandler),
	}
}

//Register 注册回调
func (s *Register) Register(code cmd.Code, handler CodeHandler) {
	s.callbacks[code] = append(s.callbacks[code], handler)
}

//Register 注册回调
func (s *Register) RegisterFunc(code cmd.Code, callback func(code cmd.Code, data []byte) error) {
	s.callbacks[code] = append(s.callbacks[code], Callback(callback))
}

//Callback 调用回调
func (s *Register) Callback(code cmd.Code, data []byte) error {
	m := s.callbacks

	for _, handler := range m[code] {
		if e := handler.ServerCode(code, data); e != nil {
			return e
		}
	}
	return nil
}