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, err := server.NewServer(cfg)
24			if err != nil {
25				return err
26			}
27
28			done := make(chan os.Signal, 1)
29			lch := make(chan error, 1)
30			go func() {
31				defer close(lch)
32				defer close(done)
33				lch <- s.Start()
34			}()
35
36			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
37			<-done
38
39			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
40			defer cancel()
41			if err := s.Shutdown(ctx); err != nil {
42				return err
43			}
44
45			// wait for serve to finish
46			return <-lch
47		},
48	}
49)