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.
79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package router
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
ctxpkg "github.com/noahlann/nnet/pkg/context"
|
|
"github.com/noahlann/nnet/pkg/router"
|
|
)
|
|
|
|
// route 路由实现
|
|
type route struct {
|
|
matcher router.Matcher
|
|
handler router.Handler
|
|
middlewares []router.Handler
|
|
requestType reflect.Type
|
|
responseType reflect.Type
|
|
codecName string
|
|
}
|
|
|
|
// newRoute 创建新路由
|
|
func newRoute(matcher router.Matcher, handler router.Handler, config *router.RouteConfig) *route {
|
|
r := &route{
|
|
matcher: matcher,
|
|
handler: handler,
|
|
middlewares: make([]router.Handler, 0),
|
|
requestType: nil,
|
|
responseType: nil,
|
|
codecName: "",
|
|
}
|
|
|
|
if config != nil {
|
|
r.requestType = config.RequestType
|
|
r.responseType = config.ResponseType
|
|
r.codecName = config.CodecName
|
|
}
|
|
|
|
return r
|
|
}
|
|
|
|
// Use 添加中间件
|
|
func (r *route) Use(middleware ...router.Handler) router.Route {
|
|
r.middlewares = append(r.middlewares, middleware...)
|
|
return r
|
|
}
|
|
|
|
// Handler 获取处理器
|
|
func (r *route) Handler() router.Handler {
|
|
return r.buildHandler()
|
|
}
|
|
|
|
// RequestType 获取请求类型
|
|
func (r *route) RequestType() reflect.Type {
|
|
return r.requestType
|
|
}
|
|
|
|
// ResponseType 获取响应类型
|
|
func (r *route) ResponseType() reflect.Type {
|
|
return r.responseType
|
|
}
|
|
|
|
// CodecName 获取编解码器名称
|
|
func (r *route) CodecName() string {
|
|
return r.codecName
|
|
}
|
|
|
|
// buildHandler 构建处理器链
|
|
func (r *route) buildHandler() router.Handler {
|
|
return func(ctx ctxpkg.Context) error {
|
|
// 执行中间件
|
|
for _, middleware := range r.middlewares {
|
|
if err := middleware(ctx); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// 执行处理器
|
|
return r.handler(ctx)
|
|
}
|
|
}
|