func runProgressBar()

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
}