github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mch/core/handler.go (about) 1 package core 2 3 type Handler interface { 4 ServeMsg(*Context) 5 } 6 7 // HandlerChain -------------------------------------------------------------------------------------------------------- 8 9 const maxHandlerChainSize = 64 10 11 var _ Handler = (HandlerChain)(nil) 12 13 type HandlerChain []Handler 14 15 // ServeMsg 实现 Handler 接口 16 func (chain HandlerChain) ServeMsg(ctx *Context) { 17 ctx.handlers = chain 18 ctx.Next() 19 } 20 21 func (chain *HandlerChain) AppendHandlerFunc(handlers ...func(*Context)) { 22 if len(handlers) == 0 { 23 return 24 } 25 for _, h := range handlers { 26 if h == nil { 27 panic("handler can not be nil") 28 } 29 } 30 handlers2 := make(HandlerChain, len(handlers)) 31 for i := 0; i < len(handlers); i++ { 32 handlers2[i] = HandlerFunc(handlers[i]) 33 } 34 chain.AppendHandler(handlers2) 35 } 36 37 func (chain *HandlerChain) AppendHandler(handlers ...Handler) { 38 if len(handlers) == 0 { 39 return 40 } 41 for _, h := range handlers { 42 if h == nil { 43 panic("handler can not be nil") 44 } 45 } 46 *chain = combineHandlerChain(*chain, handlers) 47 } 48 49 func combineHandlerChain(middlewares, handlers HandlerChain) HandlerChain { 50 if len(middlewares)+len(handlers) > maxHandlerChainSize { 51 panic("too many handlers") 52 } 53 return append(middlewares, handlers...) 54 } 55 56 // HandlerFunc --------------------------------------------------------------------------------------------------------- 57 58 var _ Handler = HandlerFunc(nil) 59 60 type HandlerFunc func(*Context) 61 62 // ServeMsg 实现 Handler 接口 63 func (fn HandlerFunc) ServeMsg(ctx *Context) { fn(ctx) }