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.

40 lines
827 B
Go

package middleware
import (
ctxpkg "github.com/noahlann/nnet/pkg/context"
)
// Middleware 中间件接口
type Middleware func(ctx ctxpkg.Context, next Handler) error
// Handler 处理器
type Handler func(ctx ctxpkg.Context) error
// Chain 中间件链
type Chain struct {
middlewares []Middleware
}
// NewChain 创建中间件链
func NewChain(middlewares ...Middleware) *Chain {
return &Chain{
middlewares: middlewares,
}
}
// Then 执行中间件链
func (c *Chain) Then(handler Handler) Handler {
for i := len(c.middlewares) - 1; i >= 0; i-- {
handler = c.wrapHandler(c.middlewares[i], handler)
}
return handler
}
// wrapHandler 包装处理器
func (c *Chain) wrapHandler(middleware Middleware, handler Handler) Handler {
return func(ctx ctxpkg.Context) error {
return middleware(ctx, handler)
}
}