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