1package main
 2
 3import (
 4	"context"
 5	"os"
 6	"os/signal"
 7	"syscall"
 8	"time"
 9
10	_ "github.com/charmbracelet/soft-serve/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			ctx := cmd.Context()
24			cfg := config.DefaultConfig()
25			s, err := server.NewServer(ctx, cfg)
26			if err != nil {
27				return err
28			}
29
30			done := make(chan os.Signal, 1)
31			lch := make(chan error, 1)
32			go func() {
33				defer close(lch)
34				defer close(done)
35				lch <- s.Start()
36			}()
37
38			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
39			<-done
40
41			ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
42			defer cancel()
43			if err := s.Shutdown(ctx); err != nil {
44				return err
45			}
46
47			// wait for serve to finish
48			return <-lch
49		},
50	}
51)