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)