diff --git a/cli/cli.go b/cli/cli.go index e4a1a9b..fb1cb5d 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "log/slog" "os" "os/signal" "syscall" @@ -15,10 +16,8 @@ import ( ) var ( - // SignalChan ... - SignalChan = make(chan os.Signal, 1) - // ErrSignal ... - ErrSignal = errors.New("signal") + // errSignal ... + errSignal = errors.New("signal") ) // Run provides the common boilerplate code around executing a cobra command. @@ -42,17 +41,28 @@ func Run(cmd *cobra.Command) int { } func execute(cmd *cobra.Command) error { - ctx := context.Background() + ctx, cancel := context.WithCancelCause(context.Background()) + // graceful shutdown signal - signal.Notify(SignalChan, syscall.SIGINT, syscall.SIGTERM) + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) + go func() { + select { + case s := <-signalChan: + slog.WarnContext(ctx, "Signal received", "signal", s) + cancel(fmt.Errorf("%w %s received", errSignal, s)) + case <-ctx.Done(): + } + }() err := cmd.ExecuteContext(ctx) if err == nil { return nil } - if errors.Is(err, ErrSignal) { + if errors.Is(err, errSignal) { return nil } + return err }