use a pulsating spinner
This commit is contained in:
parent
a3fcecf943
commit
7550fd1b7f
14
main.go
14
main.go
@ -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()))
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user