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