87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
package bunrouter
|
|
|
|
import "net/http"
|
|
|
|
type config struct {
|
|
notFoundHandler HandlerFunc
|
|
methodNotAllowedHandler HandlerFunc
|
|
|
|
group *Group
|
|
}
|
|
|
|
type Option interface {
|
|
apply(cfg *config)
|
|
}
|
|
|
|
type option func(cfg *config)
|
|
|
|
func (fn option) apply(cfg *config) {
|
|
fn(cfg)
|
|
}
|
|
|
|
// WithNotFoundHandler is called when there is no a matching pattern.
|
|
// The default NotFoundHandler is http.NotFound.
|
|
func WithNotFoundHandler(handler HandlerFunc) Option {
|
|
return option(func(c *config) {
|
|
c.notFoundHandler = c.group.wrap(handler)
|
|
})
|
|
}
|
|
|
|
// MethodNotAllowedHandler is called when a route matches, but that
|
|
// route does not have a handler for the requested method. The default
|
|
// handler just writes the status code http.StatusMethodNotAllowed.
|
|
func WithMethodNotAllowedHandler(handler HandlerFunc) Option {
|
|
return option(func(c *config) {
|
|
c.methodNotAllowedHandler = handler
|
|
})
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
type GroupOption interface {
|
|
Option
|
|
groupOption()
|
|
}
|
|
|
|
type groupOption func(cfg *config)
|
|
|
|
func (fn groupOption) apply(cfg *config) {
|
|
fn(cfg)
|
|
}
|
|
|
|
func (fn groupOption) groupOption() {}
|
|
|
|
// WithGroup calls the fn with the current Group.
|
|
func WithGroup(fn func(g *Group)) GroupOption {
|
|
return groupOption(func(c *config) {
|
|
fn(c.group)
|
|
})
|
|
}
|
|
|
|
// WithMiddleware adds a middleware handler to the Group's middleware stack.
|
|
func WithMiddleware(fns ...MiddlewareFunc) GroupOption {
|
|
return groupOption(func(c *config) {
|
|
c.group.stack = append(c.group.stack, fns...)
|
|
})
|
|
}
|
|
|
|
// Use is an alias for WithMiddleware.
|
|
func Use(fns ...MiddlewareFunc) GroupOption {
|
|
return WithMiddleware(fns...)
|
|
}
|
|
|
|
// WithHandler is like WithMiddleware, but the handler can't modify the request.
|
|
func WithHandler(fn HandlerFunc) GroupOption {
|
|
return groupOption(func(c *config) {
|
|
middleware := func(next HandlerFunc) HandlerFunc {
|
|
return func(w http.ResponseWriter, req Request) error {
|
|
if err := fn(w, req); err != nil {
|
|
return err
|
|
}
|
|
return next(w, req)
|
|
}
|
|
}
|
|
c.group.stack = append(c.group.stack, middleware)
|
|
})
|
|
}
|