package server import ( "context" "fmt" "log/slog" "net/http" "git.systemact.nl/henk/mars-terraform-registry/internal/config" ) type Server struct { httpServer *http.Server cfg *config.Config } func NewServer(cfg *config.Config) (*Server, error) { srv := &Server{ cfg: cfg, } err := srv.setup() if err != nil { return nil, fmt.Errorf("setting up server: %w", err) } return srv, err } func (s *Server) setup() error { mux := http.NewServeMux() mux.HandleFunc("/health", s.handleHealth) s.httpServer = &http.Server{ Addr: s.cfg.Server.BindAddress, Handler: mux, ReadTimeout: s.cfg.Server.ReadTimeout, WriteTimeout: s.cfg.Server.WriteTimeout, } return nil } func (s *Server) Run(ctx context.Context) error { slog.Info("Starting Mars Terraform Registry", "address", s.cfg.Server.BindAddress) errCh := make(chan error, 1) go func() { if s.cfg.TLS.Enabled { errCh <- s.httpServer.ListenAndServeTLS(s.cfg.TLS.CertFile, s.cfg.TLS.KeyFile) } else { errCh <- s.httpServer.ListenAndServe() } }() select { case <-ctx.Done(): slog.Info("Shutdown signal received") return s.Shutdown(context.Background()) case err := <-errCh: return err } } func (s *Server) Shutdown(ctx context.Context) error { var errs []error if err := s.httpServer.Shutdown(ctx); err != nil { errs = append(errs, fmt.Errorf("http server shutdown: %w", err)) } if len(errs) > 0 { return fmt.Errorf("shutdown errors: %v", errs) } return nil }