use a pulsating spinner

This commit is contained in:
Patrick Devine 2023-11-20 17:27:53 -08:00
parent a3fcecf943
commit 7550fd1b7f
3 changed files with 26 additions and 13 deletions

14
main.go
View File

@ -2,11 +2,25 @@ package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/jmorganca/ollama/cmd"
"github.com/spf13/cobra"
)
func main() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT)
go func() {
<-sigChan
fmt.Print("\033[?25h")
os.Exit(0)
}()
cobra.CheckErr(cmd.NewCLI().ExecuteContext(context.Background()))
}

View File

@ -81,9 +81,6 @@ func (p *Progress) render() error {
p.mu.Lock()
defer p.mu.Unlock()
fmt.Fprint(p.w, "\033[?25l")
defer fmt.Fprint(p.w, "\033[?25h")
// clear already rendered progress lines
for i := 0; i < p.pos; i++ {
if i > 0 {
@ -107,6 +104,9 @@ func (p *Progress) render() error {
func (p *Progress) start() {
p.ticker = time.NewTicker(100 * time.Millisecond)
fmt.Fprint(p.w, "\033[?25l")
defer fmt.Fprintln(p.w, "\033[?25h")
for range p.ticker.C {
p.render()
}

View File

@ -10,8 +10,6 @@ type Spinner struct {
message string
messageWidth int
parts []string
value int
ticker *time.Ticker
@ -22,10 +20,8 @@ type Spinner struct {
func NewSpinner(message string) *Spinner {
s := &Spinner{
message: message,
parts: []string{
"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏",
},
started: time.Now(),
value: 231,
}
go s.start()
return s
@ -48,18 +44,21 @@ func (s *Spinner) String() string {
}
if s.stopped.IsZero() {
spinner := s.parts[s.value]
sb.WriteString(spinner)
sb.WriteString(" ")
sb.WriteString(fmt.Sprintf("\033[48;5;%dm ", s.value))
sb.WriteString("\033[0m")
}
return sb.String()
}
func (s *Spinner) start() {
s.ticker = time.NewTicker(100 * time.Millisecond)
s.ticker = time.NewTicker(40 * time.Millisecond)
for range s.ticker.C {
s.value = (s.value + 1) % len(s.parts)
if s.value < 255 {
s.value++
} else {
s.value = 231
}
if !s.stopped.IsZero() {
return
}