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 }