You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.4 KiB

11 months ago
package rest
import (
"git.diulo.com/mogfee/kit/rest/httpx"
"git.diulo.com/mogfee/kit/rest/internal/cors"
"git.diulo.com/mogfee/kit/rest/router"
"net/http"
)
type (
RunOption func(server *Server)
Server struct {
ngin *engine
router httpx.Router
}
)
func NewServer(c RestConf, opts ...RunOption) *Server {
srv := &Server{
ngin: newEngine(c),
router: router.NewRouter(),
}
for _, opt := range opts {
opt(srv)
}
return srv
}
func (s *Server) AddRoute(r Route, opts ...RouteOption) {
s.AddRoutes([]Route{r}, opts...)
}
func (s *Server) AddRoutes(rs []Route, opts ...RouteOption) {
r := featureRoutes{
routes: rs,
}
for _, opt := range opts {
opt(&r)
}
s.ngin.addRoutes(r)
}
func (s *Server) Start() error {
return s.ngin.start(s.router)
}
func (s *Server) Use(middleware ...Middleware) {
s.ngin.use(middleware...)
}
func WithCors(origin ...string) RunOption {
return func(server *Server) {
server.router.SetNotAllowedHandler(cors.NotAllowedHandler())
server.router = newCorsRouter(server.router, origin...)
}
}
type corsRouter struct {
httpx.Router
middleware Middleware
}
func newCorsRouter(router httpx.Router, origin ...string) httpx.Router {
return &corsRouter{
Router: router,
middleware: cors.Middleware(func(w http.Header) {
}),
}
}
func (c *corsRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c.middleware(c.Router.ServeHTTP)(w, r)
}