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