package main import ( "context" "errors" "log" "net/http" "os" "os/signal" "syscall" "time" "tutor/internal/app" "tutor/internal/config" ) func main() { cfg := config.LoadFromEnv() server := app.NewServer(cfg) errs := make(chan error, 1) go func() { log.Printf("starting tutor-api on %s", cfg.HTTPAddr) errs <- server.ListenAndServe() }() stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) select { case sig := <-stop: log.Printf("received signal %s; shutting down", sig) case err := <-errs: if err != nil && !errors.Is(err, http.ErrServerClosed) { log.Fatalf("server error: %v", err) } return } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Fatalf("shutdown error: %v", err) } }