mirror of
				https://github.com/aykhans/dodo.git
				synced 2025-11-03 22:19:58 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package requests
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/jedib0t/go-pretty/v6/progress"
 | 
						|
)
 | 
						|
 | 
						|
// streamProgress streams the progress of a task to the console using a progress bar.
 | 
						|
// It listens for increments on the provided channel and updates the progress bar accordingly.
 | 
						|
//
 | 
						|
// The function will stop and mark the progress as errored if the context is cancelled.
 | 
						|
// It will also stop and mark the progress as done when the total number of increments is reached.
 | 
						|
func streamProgress(
 | 
						|
	ctx context.Context,
 | 
						|
	wg *sync.WaitGroup,
 | 
						|
	total uint,
 | 
						|
	message string,
 | 
						|
	increase <-chan int64,
 | 
						|
) {
 | 
						|
	defer wg.Done()
 | 
						|
	pw := progress.NewWriter()
 | 
						|
	pw.SetTrackerPosition(progress.PositionRight)
 | 
						|
	pw.SetStyle(progress.StyleBlocks)
 | 
						|
	pw.SetTrackerLength(40)
 | 
						|
	pw.SetUpdateFrequency(time.Millisecond * 250)
 | 
						|
	if total == 0 {
 | 
						|
		pw.Style().Visibility.Percentage = false
 | 
						|
	}
 | 
						|
	go pw.Render()
 | 
						|
	dodosTracker := progress.Tracker{
 | 
						|
		Message: message,
 | 
						|
		Total:   int64(total),
 | 
						|
	}
 | 
						|
	pw.AppendTracker(&dodosTracker)
 | 
						|
 | 
						|
	for {
 | 
						|
		select {
 | 
						|
		case <-ctx.Done():
 | 
						|
			if err := ctx.Err(); err == context.Canceled || err == context.DeadlineExceeded {
 | 
						|
				dodosTracker.MarkAsDone()
 | 
						|
			} else {
 | 
						|
				dodosTracker.MarkAsErrored()
 | 
						|
			}
 | 
						|
			time.Sleep(time.Millisecond * 300)
 | 
						|
			fmt.Printf("\r")
 | 
						|
			return
 | 
						|
 | 
						|
		case value := <-increase:
 | 
						|
			dodosTracker.Increment(value)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |