parent
7d9d206e49
commit
81e1aea8c9
24
cli/cli.go
24
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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue