go-dart/group.go
2025-04-22 06:59:36 +00:00

98 lines
2.4 KiB
Go

package dart
import (
"net/http"
"strings"
)
type Group struct {
prefix string
middlewares []Middleware
parent *Group
dart *Dart
}
func (g *Group) Group(prefix string) *Group {
return &Group{
prefix: prefix,
parent: g,
dart: g.dart,
}
}
func (g *Group) Static(prefix, root string, middlewares ...Middleware) {
fileServer := http.FileServer(http.Dir(root))
fullPath := joinPaths(g.getFullPrefix(), prefix)
g.register(http.MethodGet, prefix+"/*filepath", func(ctx *Context) error {
http.StripPrefix(fullPath, fileServer).ServeHTTP(ctx.response, ctx.request)
return nil
})
}
func (g *Group) Use(middlewares ...Middleware) {
g.middlewares = append(g.middlewares, middlewares...)
}
func (g *Group) GET(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodGet, path, h, middlewares...)
}
func (g *Group) POST(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodPost, path, h, middlewares...)
}
func (g *Group) PUT(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodPut, path, h, middlewares...)
}
func (g *Group) DELETE(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodDelete, path, h, middlewares...)
}
func (g *Group) PATCH(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodPatch, path, h, middlewares...)
}
func (g *Group) HEAD(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodHead, path, h, middlewares...)
}
func (g *Group) OPTIONS(path string, h Handler, middlewares ...Middleware) {
g.register(http.MethodOptions, path, h, middlewares...)
}
func (g *Group) getFullPrefix() string {
if g.parent != nil {
return joinPaths(g.parent.getFullPrefix(), g.prefix)
}
return g.prefix
}
func (g *Group) getAllMiddlewares() []Middleware {
middlewares := make([]Middleware, 0)
current := g
for current != nil {
middlewares = append(current.middlewares, middlewares...)
current = current.parent
}
return middlewares
}
func (g *Group) register(method string, path string, h Handler, middlewares ...Middleware) {
fullPath := joinPaths(g.getFullPrefix(), path)
allMiddlewares := append(g.getAllMiddlewares(), middlewares...)
g.dart.register(method, fullPath, h, allMiddlewares...)
}
func joinPaths(a, b string) string {
a = strings.TrimSuffix(a, "/")
b = strings.TrimPrefix(b, "/")
if b == "" {
return a
}
return a + "/" + b
}