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)