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 ( import (
"context" "context"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/jmorganca/ollama/cmd" "github.com/jmorganca/ollama/cmd"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
func main() { 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())) cobra.CheckErr(cmd.NewCLI().ExecuteContext(context.Background()))
} }

View File

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

View File

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