Explorar o código

use a pulsating spinner

Patrick Devine hai 1 ano
pai
achega
7550fd1b7f
Modificáronse 3 ficheiros con 26 adicións e 13 borrados
  1. 14 0
      main.go
  2. 3 3
      progress/progress.go
  3. 9 10
      progress/spinner.go

+ 14 - 0
main.go

@@ -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()))
 }

+ 3 - 3
progress/progress.go

@@ -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()
 	}

+ 9 - 10
progress/spinner.go

@@ -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
 		}