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