diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-02 02:11:26 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-02 02:11:26 -0400 |
| commit | d67596acd921f75caaa4e604bc1ccf163bd0729e (patch) | |
| tree | d7d0d30d20a1a63173acc183e3edd4163a82bc1d /cmd/server.go | |
| parent | 3b3fc9ebfce6e0944b12b929b6abc95251a0e64e (diff) | |
Add experimental http server
Diffstat (limited to 'cmd/server.go')
| -rw-r--r-- | cmd/server.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/cmd/server.go b/cmd/server.go new file mode 100644 index 0000000..374e5f4 --- /dev/null +++ b/cmd/server.go @@ -0,0 +1,64 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/jpappel/atlas/pkg/data" + "github.com/jpappel/atlas/pkg/server" +) + +type ServerFlags struct { + Address string + Port int +} + +func setupServerFlags(args []string, fs *flag.FlagSet, flags *ServerFlags) { + fs.StringVar(&flags.Address, "address", "", "the address to listen on") + fs.IntVar(&flags.Port, "port", 8080, "the port to bind to") + + fs.Parse(args) +} + +func runServer(gFlags GlobalFlags, sFlags ServerFlags, db *data.Query) byte { + addr := fmt.Sprintf("%s:%d", sFlags.Address, sFlags.Port) + + s := http.Server{Addr: addr, Handler: server.New(db)} + + serverErrors := make(chan error, 1) + exit := make(chan os.Signal, 1) + + signal.Notify(exit, syscall.SIGTERM, os.Interrupt) + + slog.Info("Starting server on", slog.String("addr", addr)) + go func(serverErrors chan<- error) { + if err := s.ListenAndServe(); err != nil { + serverErrors <- err + } + }(serverErrors) + + select { + case <-exit: + slog.Info("Recieved signal to shutdown") + case err := <-serverErrors: + slog.Error("Server error", err) + } + + slog.Info("Shutting down server") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := s.Shutdown(ctx); err != nil { + slog.Error("Error shutting down server", err) + return 1 + } + + return 0 +} |
