package tuu import ( "context" "fmt" "log" "net/http" "os" "os/signal" "github.com/gorilla/mux" ) type Config struct { IPAddr string Port string } func New(r Router) *App { return &App{router: r} } type App struct { router Router } func (a *App) Serve(cfg Config) error { log.Printf("http server running @ %s:%s", cfg.IPAddr, cfg.Port) r := mux.NewRouter() for _, route := range a.router.GetRoutes() { r.Handle(route.Path, route).Methods(route.Method) } for _, route := range a.router.GetStaticRoutes() { r.PathPrefix(route.Path).Handler(route.Handler) } server := http.Server{ Addr: fmt.Sprintf("%s:%s", cfg.IPAddr, cfg.Port), Handler: r, } // Check for a closing signal go func() { // Graceful shutdown sigquit := make(chan os.Signal, 1) signal.Notify(sigquit, os.Interrupt, os.Kill) sig := <-sigquit log.Printf("caught sig: %+v", sig) log.Printf("Gracefully shutting down server...") if err := server.Shutdown(context.Background()); err != nil { log.Printf("Unable to shut down server: %v", err) } else { log.Println("Server stopped") } }() // start the web server if err := server.ListenAndServe(); err != nil { return err } return nil }