Router/router.go

84 lines
1.9 KiB
Go
Raw Normal View History

2024-08-22 21:46:21 -05:00
package router
2024-09-05 14:09:09 -05:00
type Router struct {
get Tree
post Tree
delete Tree
put Tree
patch Tree
head Tree
connect Tree
trace Tree
options Tree
2024-08-22 21:46:21 -05:00
}
2024-09-05 13:02:29 -05:00
// Create a new Router containing trees for every HTTP method.
2024-09-05 14:09:09 -05:00
func New() *Router {
return &Router{}
2024-08-22 21:46:21 -05:00
}
// Registers a new handler for the given method and path.
2024-09-05 14:09:09 -05:00
func (router *Router) Add(method string, path string, handler string) {
2024-08-22 21:46:21 -05:00
tree := router.selectTree(method)
tree.Add(path, handler)
}
// Finds the handler and parameters for the given route.
2024-09-05 14:09:09 -05:00
func (router *Router) Lookup(method string, path string) (string, []Parameter) {
2024-08-22 21:46:21 -05:00
if method[0] == 'G' {
return router.get.Lookup(path)
}
tree := router.selectTree(method)
return tree.Lookup(path)
}
// Finds the handler and parameters for the given route without using any memory allocations.
2024-09-05 14:09:09 -05:00
func (router *Router) LookupNoAlloc(method string, path string, addParameter func(string, string)) string {
2024-08-22 21:46:21 -05:00
if method[0] == 'G' {
return router.get.LookupNoAlloc(path, addParameter)
}
tree := router.selectTree(method)
return tree.LookupNoAlloc(path, addParameter)
}
// Traverses all trees and calls the given function on every node.
2024-09-05 14:09:09 -05:00
func (router *Router) Map(transform func(string) string) {
2024-08-22 21:46:21 -05:00
router.get.Map(transform)
router.post.Map(transform)
router.delete.Map(transform)
router.put.Map(transform)
router.patch.Map(transform)
router.head.Map(transform)
router.connect.Map(transform)
router.trace.Map(transform)
router.options.Map(transform)
}
2024-09-05 13:02:29 -05:00
// Returns the tree of the given HTTP method.
2024-09-05 14:09:09 -05:00
func (router *Router) selectTree(method string) *Tree {
2024-08-22 21:46:21 -05:00
switch method {
case "GET":
return &router.get
case "POST":
return &router.post
case "DELETE":
return &router.delete
case "PUT":
return &router.put
case "PATCH":
return &router.patch
case "HEAD":
return &router.head
case "CONNECT":
return &router.connect
case "TRACE":
return &router.trace
case "OPTIONS":
return &router.options
default:
return nil
}
}