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