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.

87 lines
2.7 KiB
Go

package router
import (
ctxpkg "github.com/noahlann/nnet/pkg/context"
"github.com/noahlann/nnet/pkg/router"
)
// routerGroup 路由分组实现
type routerGroup struct {
router *routerImpl
prefix string
middlewares []router.Handler
}
// newRouterGroup 创建路由分组
func newRouterGroup(r *routerImpl, prefix string) *routerGroup {
return &routerGroup{
router: r,
prefix: prefix,
middlewares: make([]router.Handler, 0),
}
}
// Register 注册路由
func (g *routerGroup) Register(matcher router.Matcher, handler router.Handler, opts ...router.RouteOption) router.Route {
// 应用分组中间件
wrappedHandler := g.wrapHandler(handler)
return g.router.Register(matcher, wrappedHandler, opts...)
}
// RegisterString 注册字符串路由
func (g *routerGroup) RegisterString(pattern string, handler router.Handler, opts ...router.RouteOption) router.Route {
// 添加前缀
fullPattern := g.prefix + pattern
return g.router.RegisterString(fullPattern, g.wrapHandler(handler), opts...)
}
// RegisterFrameHeader 注册帧头匹配路由
func (g *routerGroup) RegisterFrameHeader(field, operator string, value interface{}, handler router.Handler, opts ...router.RouteOption) router.Route {
return g.router.RegisterFrameHeader(field, operator, value, g.wrapHandler(handler), opts...)
}
// RegisterFrameData 注册帧数据匹配路由
func (g *routerGroup) RegisterFrameData(path, operator string, value interface{}, handler router.Handler, opts ...router.RouteOption) router.Route {
return g.router.RegisterFrameData(path, operator, value, g.wrapHandler(handler), opts...)
}
// RegisterCustom 注册自定义匹配路由
func (g *routerGroup) RegisterCustom(fn func(input router.MatchInput, ctx ctxpkg.Context) bool, handler router.Handler, opts ...router.RouteOption) router.Route {
return g.router.RegisterCustom(fn, g.wrapHandler(handler), opts...)
}
// Group 创建子分组
func (g *routerGroup) Group() router.RouterGroup {
return newRouterGroup(g.router, g.prefix)
}
// Use 添加中间件
func (g *routerGroup) Use(middleware ...router.Handler) router.RouterGroup {
g.middlewares = append(g.middlewares, middleware...)
return g
}
// Prefix 获取分组前缀
func (g *routerGroup) Prefix() string {
return g.prefix
}
// Match 匹配路由
func (g *routerGroup) Match(input router.MatchInput, ctx ctxpkg.Context) (router.Route, router.Handler, error) {
return g.router.Match(input, ctx)
}
// wrapHandler 包装处理器(应用中间件)
func (g *routerGroup) wrapHandler(handler router.Handler) router.Handler {
return func(ctx ctxpkg.Context) error {
// 执行分组中间件
for _, middleware := range g.middlewares {
if err := middleware(ctx); err != nil {
return err
}
}
// 执行处理器
return handler(ctx)
}
}