98 lines
2.4 KiB
Go
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
|
|
}
|