in packages/cli/internal/pkg/aws/cdk/progress.go [156:201]
func runProgressBar(ctx context.Context, description string, numberOfChannels int) chan ProgressEvent {
receiver := make(chan ProgressEvent)
bar := progressTemplate.New(0).
Set("description", description).
Start()
go func() {
var oldProgressEvents = make(map[string]ProgressEvent, numberOfChannels)
var keyWithSteps = make(map[string]bool, numberOfChannels)
totalSteps, currentStep := 0, 0
for {
select {
case progressEvent := <-receiver:
oldEvent, matchExists := oldProgressEvents[progressEvent.ExecutionName]
if matchExists {
totalSteps += progressEvent.TotalSteps - oldEvent.TotalSteps
currentStep += progressEvent.CurrentStep - oldEvent.CurrentStep
oldProgressEvents[oldEvent.ExecutionName] = progressEvent
_, keysExist := keyWithSteps[progressEvent.ExecutionName]
if !keysExist && progressEvent.TotalSteps > 0 {
keyWithSteps[progressEvent.ExecutionName] = true
}
} else if progressEvent.ExecutionName != "" {
totalSteps += progressEvent.TotalSteps
currentStep += progressEvent.CurrentStep
oldProgressEvents[progressEvent.ExecutionName] = progressEvent
}
if len(keyWithSteps) == numberOfChannels {
bar.SetCurrent(int64(currentStep))
}
case <-ctx.Done():
close(receiver)
bar.SetCurrent(bar.Total()).Finish()
return
default:
// No new events; nothing to do
}
sleep(100 * time.Millisecond)
}
}()
return receiver
}