From 2552adbd3e239c3cbdcccc69a18c8010302b1eb8 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Fri, 25 Oct 2024 13:17:35 -0500 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20I=20think=20I'm=20finally?= =?UTF-8?q?=20happy=20with=20the=20Spinner=20implementation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli/spin/spin.go | 67 +++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/cli/spin/spin.go b/cli/spin/spin.go index dd584d8..2896335 100644 --- a/cli/spin/spin.go +++ b/cli/spin/spin.go @@ -58,28 +58,47 @@ func (m model) View() string { return str } -func Spin(ctx context.Context, message string) (chan string, chan error) { - p := tea.NewProgram(newModel(message), tea.WithContext(ctx)) - - msgChan := make(chan string, 10) - errChan := make(chan error) - - go func() { - for { - m := <-msgChan - p.Send(textMessage(m)) - } - }() - go func() { - _, err := p.Run() - if errors.Is(err, context.Canceled) { - err = nil - } else if errors.Is(err, context.DeadlineExceeded) { - err = nil - } else if errors.Is(err, tea.ErrProgramKilled) { - err = nil - } - errChan <- err - }() - return msgChan, errChan +type Spinner interface { + Wait() error + SetMessage(string) + Err() error +} + +var _ Spinner = new(spin) + +type spin struct { + p *tea.Program + err error + finished chan struct{} +} + +func (s *spin) Wait() error { + <-s.finished + return s.Err() +} + +func (s *spin) SetMessage(msg string) { + s.p.Send(textMessage(msg)) +} + +func (s *spin) Err() error { + if errors.Is(s.err, context.Canceled) { + return nil + } else if errors.Is(s.err, context.DeadlineExceeded) { + return nil + } else if errors.Is(s.err, tea.ErrProgramKilled) { + return nil + } + return s.err +} + +func Spin(ctx context.Context, message string) Spinner { + p := tea.NewProgram(newModel(message), tea.WithContext(ctx)) + s := &spin{p: p, finished: make(chan struct{}, 1)} + go func() { + _, err := s.p.Run() + s.err = err + s.finished <- struct{}{} + }() + return s }