package main import ( "context" "errors" "fmt" "log" "net/http" "os" "os/signal" "syscall" ) const listenAddress = ":8080" func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() logger := log.Default() if err := run(ctx, os.Getenv("WEBHOOK_URL"), listenAddress, logger); err != nil && !errors.Is(err, http.ErrServerClosed) { logger.Fatalf("Server stopped unexpectedly: %v", err) } } func run(ctx context.Context, webhookURL, address string, logger *log.Logger) error { app, err := newApplication(applicationConfig{WebhookURL: webhookURL, Logger: logger}) if err != nil { return fmt.Errorf("configuration failed: %w", err) } listener, err := netListen("tcp", address) if err != nil { return fmt.Errorf("listen on %s: %w", address, err) } logger.Printf("Starting server on %s", address) return serve(ctx, newHTTPServer(app.handler()), listener) }