From 411a7b34498d64e5f50581a5c9f77800b8dc8552 Mon Sep 17 00:00:00 2001 From: sha1n Date: Sat, 17 Jan 2026 00:14:16 +0200 Subject: [PATCH] feat: add context support to Spinner Stop method --- README.md | 2 +- internal/main.go | 2 +- spinner.go | 14 +++++++++----- spinner_test.go | 8 ++++---- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c97f7ee..a316f87 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ spinner := termite.NewSpinner(termite.StdoutWriter, "Processing...", refreshInte if err := spinner.Start(ctx); err == nil { doWork() - _ = spinner.Stop("Done!") + _ = spinner.Stop(context.Background(), "Done!") } ``` diff --git a/internal/main.go b/internal/main.go index 5b3867c..ea849bc 100644 --- a/internal/main.go +++ b/internal/main.go @@ -146,7 +146,7 @@ func demoSpinner(ctx *demoContext) { } time.Sleep(time.Second) for _, spinner := range spinners { - _ = spinner.Stop("- Done " + taskDoneMarkUniChar) + _ = spinner.Stop(context.Background(), "- Done "+taskDoneMarkUniChar) } cancel() diff --git a/spinner.go b/spinner.go index e490b47..7099647 100644 --- a/spinner.go +++ b/spinner.go @@ -56,7 +56,7 @@ func (f *SimpleSpinnerFormatter) CharSeq() []string { // Spinner a spinning progress indicator type Spinner interface { Start(context.Context) error - Stop(string) error + Stop(ctx context.Context, message string) error SetTitle(title string) error } @@ -211,16 +211,20 @@ func (s *spinner) Start(ctx context.Context) (err error) { } // Stop stops the spinner and displays the specified message -func (s *spinner) Stop(message string) (err error) { +func (s *spinner) Stop(ctx context.Context, message string) (err error) { s.stateMx.Lock() defer s.stateMx.Unlock() if !s.active { err = errors.New("spinner not active") } else { - s.stopC <- true - s.active = false - s.printExitMessage(message) + select { + case s.stopC <- true: + s.active = false + s.printExitMessage(message) + case <-ctx.Done(): + err = ctx.Err() + } } return err diff --git a/spinner_test.go b/spinner_test.go index 9d6c4d5..9878fd2 100644 --- a/spinner_test.go +++ b/spinner_test.go @@ -78,7 +78,7 @@ func TestSpinnerTitles(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() _ = spin.Start(ctx) - _ = spin.Stop("") + _ = spin.Stop(context.Background(), "") assert.Error(t, spin.SetTitle("new title")) }) @@ -106,8 +106,8 @@ func TestSpinnerErrors(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() _ = spin.Start(ctx) - assert.NoError(t, spin.Stop("")) - assert.Error(t, spin.Stop("")) + assert.NoError(t, spin.Stop(context.Background(), "")) + assert.Error(t, spin.Stop(context.Background(), "")) }, }, { @@ -138,7 +138,7 @@ func TestSpinnerStopMessage(t *testing.T) { err := spin.Start(ctx) assert.NoError(t, err) - err = spin.Stop(expectedStopMessage) + err = spin.Stop(context.Background(), expectedStopMessage) assert.NoError(t, err) assertBufferEventuallyContains(t, emulatedStdout, expectedStopMessage)