package main import ( "context" "errors" "log/slog" "net/http" "os" "os/signal" "syscall" "time" ) func (app *application) serve() error { srv := &http.Server{ Addr: app.cfg.port, Handler: app.routes(), ErrorLog: slog.NewLogLogger(app.slogger.Handler(), slog.LevelError), // TLSConfig: tlsConfig, IdleTimeout: time.Minute, ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } shutdownError := make(chan error) go func() { quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) s := <-quit app.slogger.Info("Caught signal", "signal", s.String()) ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() err := srv.Shutdown(ctx) if err != nil { shutdownError <- err } err = app.foundryApp.Shutdown() if err != nil { shutdownError <- err } shutdownError <- nil }() switch app.cfg.mode { case API_MODE: app.slogger.Info("Starting server", "addr", srv.Addr, "env", app.cfg.env) err := srv.ListenAndServe() if !errors.Is(err, http.ErrServerClosed) { return err } app.slogger.Info("Stopped server", "addr", srv.Addr) err = <-shutdownError if err != nil { return err } case DISCORD_BOT_MODE: app.slogger.Warn("TODO: implement this mode") case TG_BOT_MODE: app.slogger.Warn("TODO: implement this mode") default: app.slogger.Error("Wrong Mode. Should be one of: 'api', 'discord', 'tg'", "mode", app.cfg.mode) } return nil }