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) }