From 09f9a2c8bf2ced13c6558fc28351e8c4b2ff27b2 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Mon, 22 May 2023 15:00:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=89=E4=B8=AA=E7=AD=89?= =?UTF-8?q?=E7=BA=A7=E5=88=86=E7=B1=BB=E7=9A=84=E8=B7=AF=E7=94=B1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/router/level_1_router.go | 32 +++++++++++++++++++++++++ server/router/level_2_router.go | 38 +++++++++++++++++++++++++++++ server/router/level_3_router.go | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 server/router/level_1_router.go create mode 100644 server/router/level_2_router.go create mode 100644 server/router/level_3_router.go diff --git a/server/router/level_1_router.go b/server/router/level_1_router.go new file mode 100644 index 0000000..35ffc81 --- /dev/null +++ b/server/router/level_1_router.go @@ -0,0 +1,32 @@ +package router + +import ( + "fmt" + "reflect" +) + +func NewLevel1Router[Route comparable, Handle any]() *Level1Router[Route, Handle] { + return &Level1Router[Route, Handle]{ + routes: map[Route]Handle{}, + } +} + +// Level1Router 支持一级分类的路由器 +type Level1Router[Route comparable, Handle any] struct { + routes map[Route]Handle +} + +func (slf *Level1Router[Route, Handle]) Route(route Route, handleFunc Handle) { + if reflect.TypeOf(handleFunc).Kind() != reflect.Func { + panic(fmt.Errorf("route[%v] registration failed, handle must be a function type", route)) + } + _, exist := slf.routes[route] + if exist { + panic(fmt.Errorf("the route[%v] has already been registered, duplicate registration is not allowed", route)) + } + slf.routes[route] = handleFunc +} + +func (slf *Level1Router[Route, Handle]) Match(route Route) Handle { + return slf.routes[route] +} diff --git a/server/router/level_2_router.go b/server/router/level_2_router.go new file mode 100644 index 0000000..ca74034 --- /dev/null +++ b/server/router/level_2_router.go @@ -0,0 +1,38 @@ +package router + +import ( + "fmt" + "reflect" +) + +func NewLevel2Router[Route comparable, Handle any]() *Level2Router[Route, Handle] { + return &Level2Router[Route, Handle]{ + routes: map[Route]map[Route]Handle{}, + } +} + +// Level2Router 支持二级分类的路由器 +type Level2Router[Route comparable, Handle any] struct { + routes map[Route]map[Route]Handle +} + +func (slf *Level2Router[Route, Handle]) Route(topRoute Route, route Route, handleFunc Handle) { + if reflect.TypeOf(handleFunc).Kind() != reflect.Func { + panic(fmt.Errorf("route[%v] registration failed, handle must be a function type", route)) + } + routes, exist := slf.routes[topRoute] + if !exist { + routes = map[Route]Handle{} + slf.routes[topRoute] = routes + } + + _, exist = routes[route] + if exist { + panic(fmt.Errorf("the route[%v:%v] has already been registered, duplicate registration is not allowed", topRoute, route)) + } + routes[route] = handleFunc +} + +func (slf *Level2Router[Route, Handle]) Match(topRoute Route, route Route) Handle { + return slf.routes[topRoute][route] +} diff --git a/server/router/level_3_router.go b/server/router/level_3_router.go new file mode 100644 index 0000000..9762427 --- /dev/null +++ b/server/router/level_3_router.go @@ -0,0 +1,42 @@ +package router + +import ( + "fmt" + "reflect" +) + +func NewLevel3Router[Route comparable, Handle any]() *Level3Router[Route, Handle] { + return &Level3Router[Route, Handle]{ + routes: map[Route]map[Route]map[Route]Handle{}, + } +} + +// Level3Router 支持三级分类的路由器 +type Level3Router[Route comparable, Handle any] struct { + routes map[Route]map[Route]map[Route]Handle +} + +func (slf *Level3Router[Route, Handle]) Route(topRoute Route, level2Route Route, route Route, handleFunc Handle) { + if reflect.TypeOf(handleFunc).Kind() != reflect.Func { + panic(fmt.Errorf("route[%v] registration failed, handle must be a function type", route)) + } + routes, exist := slf.routes[topRoute] + if !exist { + routes = map[Route]map[Route]Handle{} + slf.routes[topRoute] = routes + } + level2Routes, exist := routes[level2Route] + if !exist { + level2Routes = map[Route]Handle{} + routes[level2Route] = level2Routes + } + _, exist = level2Routes[route] + if exist { + panic(fmt.Errorf("the route[%v:%v:%v] has already been registered, duplicate registration is not allowed", topRoute, level2Route, route)) + } + level2Routes[route] = handleFunc +} + +func (slf *Level3Router[Route, Handle]) Match(topRoute Route, level2Route Route, route Route) Handle { + return slf.routes[topRoute][level2Route][route] +}