You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB
Go

package middleware
import (
ctxpkg "github.com/noahlann/nnet/pkg/context"
routerpkg "github.com/noahlann/nnet/pkg/router"
)
// Chain 中间件链
type Chain struct {
middlewares []routerpkg.Handler
}
// NewChain 创建中间件链
func NewChain(middlewares ...routerpkg.Handler) *Chain {
return &Chain{
middlewares: middlewares,
}
}
// Then 执行中间件链
func (c *Chain) Then(handler routerpkg.Handler) routerpkg.Handler {
if len(c.middlewares) == 0 {
return handler
}
// 从后往前包装
h := handler
for i := len(c.middlewares) - 1; i >= 0; i-- {
middleware := c.middlewares[i]
h = c.wrapHandler(middleware, h)
}
return h
}
// wrapHandler 包装处理器
func (c *Chain) wrapHandler(middleware, handler routerpkg.Handler) routerpkg.Handler {
return func(ctx ctxpkg.Context) error {
// 执行中间件
if err := middleware(ctx); err != nil {
return err
}
// 执行下一个处理器
return handler(ctx)
}
}
// Append 添加中间件
func (c *Chain) Append(middleware ...routerpkg.Handler) {
c.middlewares = append(c.middlewares, middleware...)
}
// Prepend 前置添加中间件
func (c *Chain) Prepend(middleware ...routerpkg.Handler) {
c.middlewares = append(middleware, c.middlewares...)
}