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  }