diff --git a/cmd/cmd.go b/cmd/cmd.go index 344bea52..96ecc243 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -24,9 +24,17 @@ func create(cmd *cobra.Command, args []string) error { filename, _ := cmd.Flags().GetString("file") client := api.NewClient() + var spinner *Spinner + request := api.CreateRequest{Name: args[0], Path: filename} fn := func(resp api.CreateProgress) error { - fmt.Println(resp.Status) + if spinner != nil { + spinner.Stop() + } + + spinner = NewSpinner(resp.Status) + go spinner.Spin(100 * time.Millisecond) + return nil } @@ -34,6 +42,10 @@ func create(cmd *cobra.Command, args []string) error { return err } + if spinner != nil { + spinner.Stop() + } + return nil } @@ -129,24 +141,8 @@ func generate(cmd *cobra.Command, model, prompt string) error { if len(strings.TrimSpace(prompt)) > 0 { client := api.NewClient() - spinner := progressbar.NewOptions(-1, - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(60*time.Millisecond), - progressbar.OptionSpinnerType(14), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetElapsedTime(false), - progressbar.OptionClearOnFinish(), - ) - - go func() { - for range time.Tick(60 * time.Millisecond) { - if spinner.IsFinished() { - break - } - - spinner.Add(1) - } - }() + spinner := NewSpinner("") + go spinner.Spin(60 * time.Millisecond) var latest api.GenerateResponse diff --git a/cmd/spinner.go b/cmd/spinner.go new file mode 100644 index 00000000..e62e451c --- /dev/null +++ b/cmd/spinner.go @@ -0,0 +1,44 @@ +package cmd + +import ( + "fmt" + "os" + "time" + + "github.com/schollz/progressbar/v3" +) + +type Spinner struct { + description string + *progressbar.ProgressBar +} + +func NewSpinner(description string) *Spinner { + return &Spinner{ + description: description, + ProgressBar: progressbar.NewOptions(-1, + progressbar.OptionSetWriter(os.Stderr), + progressbar.OptionThrottle(60*time.Millisecond), + progressbar.OptionSpinnerType(14), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionSetElapsedTime(false), + progressbar.OptionClearOnFinish(), + progressbar.OptionSetDescription(description), + ), + } +} + +func (s *Spinner) Spin(tick time.Duration) { + for range time.Tick(tick) { + if s.IsFinished() { + break + } + + s.Add(1) + } +} + +func (s *Spinner) Stop() { + s.Finish() + fmt.Println(s.description) +}