serve.go

 1package main
 2
 3import (
 4	"context"
 5	"os"
 6	"os/signal"
 7	"syscall"
 8	"time"
 9
10	"github.com/charmbracelet/log"
11	"github.com/charmbracelet/soft-serve/server"
12	"github.com/charmbracelet/soft-serve/server/config"
13	"github.com/spf13/cobra"
14)
15
16var (
17	serveCmd = &cobra.Command{
18		Use:   "serve",
19		Short: "Start the server",
20		Long:  "Start the server",
21		Args:  cobra.NoArgs,
22		RunE: func(cmd *cobra.Command, args []string) error {
23			cfg := config.DefaultConfig()
24			s, err := server.NewServer(cfg)
25			if err != nil {
26				return err
27			}
28
29			if cfg.Debug {
30				log.SetLevel(log.DebugLevel)
31			}
32
33			done := make(chan os.Signal, 1)
34			lch := make(chan error, 1)
35			go func() {
36				defer close(lch)
37				defer close(done)
38				lch <- s.Start()
39			}()
40
41			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
42			<-done
43
44			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
45			defer cancel()
46			if err := s.Shutdown(ctx); err != nil {
47				return err
48			}
49
50			// wait for serve to finish
51			return <-lch
52		},
53	}
54)