Skip to content

Commit

Permalink
Merge pull request #46 from fortytw2/main
Browse files Browse the repository at this point in the history
  • Loading branch information
chelnak authored Nov 11, 2022
2 parents e0dbf72 + 2d6c7b1 commit 29502cc
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 4 deletions.
21 changes: 17 additions & 4 deletions manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"os"
"os/signal"
"runtime"
"sync"
"time"

"github.com/chelnak/ysmrr/pkg/animations"
Expand All @@ -32,7 +33,9 @@ type SpinnerManager interface {
}

type spinnerManager struct {
spinners []*Spinner
spinners []*Spinner
mutex sync.RWMutex

chars []string
frameDuration time.Duration
spinnerColor colors.Color
Expand All @@ -58,12 +61,18 @@ func (sm *spinnerManager) AddSpinner(message string) *Spinner {
HasUpdate: sm.hasUpdate,
}
spinner := NewSpinner(opts)

sm.mutex.Lock()
defer sm.mutex.Unlock()
sm.spinners = append(sm.spinners, spinner)

return spinner
}

// GetSpinners returns the spinners managed by the manager.
func (sm *spinnerManager) GetSpinners() []*Spinner {
sm.mutex.RLock()
defer sm.mutex.RUnlock()
return sm.spinners
}

Expand Down Expand Up @@ -96,6 +105,8 @@ func (sm *spinnerManager) Stop() {
sm.ticks.Stop()

// Persist the final frame for each spinner.
sm.mutex.Lock()
defer sm.mutex.Unlock()
for _, s := range sm.spinners {
tput.ClearLine(sm.writer)
s.Print(sm.writer, sm.chars[sm.frame])
Expand Down Expand Up @@ -173,11 +184,13 @@ func (sm *spinnerManager) renderFrame(animate bool) {
return
}

tput.BufScreen(sm.writer, len(sm.spinners))
tput.Cuu(sm.writer, len(sm.spinners))
spinners := sm.GetSpinners()

tput.BufScreen(sm.writer, len(spinners))
tput.Cuu(sm.writer, len(spinners))
tput.Sc(sm.writer)

for _, s := range sm.spinners {
for _, s := range spinners {
tput.ClearLine(sm.writer)
s.Print(sm.writer, sm.chars[sm.frame])
}
Expand Down
22 changes: 22 additions & 0 deletions manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ysmrr_test

import (
"bytes"
"sync"
"testing"
"time"

Expand Down Expand Up @@ -105,3 +106,24 @@ func TestGetMessageColor(t *testing.T) {

assert.Equal(t, colors.FgHiBlue, spinnerManager.GetMessageColor())
}

func TestManagerConcurrentSpinnerUsage(t *testing.T) {
var out bytes.Buffer
spinnerManager := ysmrr.NewSpinnerManager(ysmrr.WithWriter(&out))
spinnerManager.Start()

var wg sync.WaitGroup
for _, msg := range []string{"test-1", "test-2", "test-3"} {
wg.Add(1)
go func(wg *sync.WaitGroup, msg string) {
defer wg.Done()

s := spinnerManager.AddSpinner(msg)
s.UpdateMessage(msg + "-update")
s.Complete()
}(&wg, msg)
}
wg.Wait()

spinnerManager.Stop()
}
2 changes: 2 additions & 0 deletions spinner.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ func (s *Spinner) Print(w io.Writer, char string) {
print(w, char, s.spinnerColor)
}

s.mutex.Lock()
defer s.mutex.Unlock()
message := fmt.Sprintf(" %s\r\n", s.message)
print(w, message, s.messageColor)
}
Expand Down

0 comments on commit 29502cc

Please sign in to comment.