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