Cybersecurity-Projects/PROJECTS/intermediate/sbom-generator-vulnerabilit.../internal/ui/spinner.go

52 lines
800 B
Go

// ©AngelaMos | 2026
// spinner.go
package ui
import (
"fmt"
"sync"
"time"
)
var spinChars = []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}
type Spinner struct {
message string
stop chan struct{}
done sync.WaitGroup
}
func NewSpinner(message string) *Spinner {
return &Spinner{
message: message,
stop: make(chan struct{}),
}
}
func (s *Spinner) Start() {
s.done.Add(1)
go func() {
defer s.done.Done()
i := 0
ticker := time.NewTicker(80 * time.Millisecond)
defer ticker.Stop()
for {
select {
case <-s.stop:
fmt.Print("\r\033[K")
return
case <-ticker.C:
fmt.Printf("\r %s %s", Cyan(spinChars[i%len(spinChars)]), s.message)
i++
}
}
}()
}
func (s *Spinner) Stop() {
close(s.stop)
s.done.Wait()
}