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)