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) }