aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/server.go')
-rw-r--r--cmd/server.go64
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
+}