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