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 }