github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/runbits/runtime/progress/dotprogress.go (about) 1 package progress 2 3 import ( 4 "time" 5 6 "github.com/ActiveState/cli/internal/locale" 7 "github.com/ActiveState/cli/internal/logging" 8 "github.com/ActiveState/cli/internal/output" 9 "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" 10 ) 11 12 type DotProgressDigester struct { 13 out output.Outputer 14 spinner *output.Spinner 15 success bool 16 } 17 18 // NewDotProgressIndicator prints dots at an interval while a runtime is being setup (during solve, 19 // download, and install steps). 20 // The primary goal is to indicate to various CI systems (or during non-interactive mode) that 21 // progress is being made. 22 func NewDotProgressIndicator(out output.Outputer) *DotProgressDigester { 23 return &DotProgressDigester{out: out} 24 } 25 26 func (d *DotProgressDigester) Handle(event events.Eventer) error { 27 switch event.(type) { 28 case events.Start: 29 d.spinner = output.StartSpinner(d.out, locale.T("setup_runtime"), time.Second) 30 case events.Success: 31 d.success = true 32 } 33 return nil 34 } 35 36 func (d *DotProgressDigester) Close() error { 37 if d.spinner == nil { 38 logging.Warning("DotProgressDigester.Close called with no active spinner") 39 return nil 40 } 41 if d.success { 42 d.spinner.Stop(locale.T("progress_completed")) 43 } else { 44 d.spinner.Stop(locale.T("progress_failed")) 45 } 46 return nil 47 }