github.com/deadlysurgeon/weather@v0.0.0-20240402201029-3925d9f784b1/main.go (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"net/http"
     7  	"os"
     8  	"os/signal"
     9  
    10  	"github.com/deadlysurgeon/weather/net"
    11  	"github.com/deadlysurgeon/weather/settings"
    12  	"github.com/deadlysurgeon/weather/weather"
    13  )
    14  
    15  const maxAttempts = 10
    16  
    17  func main() {
    18  	if err := run(); err != nil {
    19  		fmt.Fprintln(os.Stderr, err)
    20  		os.Exit(1)
    21  	}
    22  }
    23  
    24  func run() error {
    25  	config, err := settings.Process[settings.App]()
    26  	if err != nil {
    27  		return fmt.Errorf("failed to set up config: %w", err)
    28  	}
    29  
    30  	weather, err := weather.New(config)
    31  	if err != nil {
    32  		return fmt.Errorf("failed to set up weather service: %w", err)
    33  	}
    34  
    35  	server, err := net.New(config, weather)
    36  	if err != nil {
    37  		return fmt.Errorf("failed to set up net server instance: %w", err)
    38  	}
    39  
    40  	go notify(server)
    41  
    42  	return serverLoop(server)
    43  }
    44  
    45  func notify(server *net.Server) {
    46  	c := make(chan os.Signal, 1)
    47  	signal.Notify(c, os.Interrupt)
    48  	<-c
    49  	fmt.Println("Stopping server")
    50  
    51  	server.Stop()
    52  	<-c
    53  	os.Exit(1)
    54  }
    55  
    56  func serverLoop(server *net.Server) error {
    57  	var attempts int
    58  	for {
    59  		if err := server.Start(); err != nil {
    60  			if errors.Is(err, http.ErrServerClosed) {
    61  				return nil
    62  			}
    63  			fmt.Fprintln(os.Stderr, "Server returned an error:", err)
    64  		}
    65  		attempts++
    66  		if attempts >= maxAttempts {
    67  			return fmt.Errorf("Failed too many times")
    68  		}
    69  		fmt.Println("Attempting to restart server...")
    70  	}
    71  }