136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package mpb
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"sync"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| // ContainerOption is a func option to alter default behavior of a bar
 | |
| // container. Container term refers to a Progress struct which can
 | |
| // hold one or more Bars.
 | |
| type ContainerOption func(*pState)
 | |
| 
 | |
| // WithWaitGroup provides means to have a single joint point. If
 | |
| // *sync.WaitGroup is provided, you can safely call just p.Wait()
 | |
| // without calling Wait() on provided *sync.WaitGroup. Makes sense
 | |
| // when there are more than one bar to render.
 | |
| func WithWaitGroup(wg *sync.WaitGroup) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.uwg = wg
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithWidth sets container width. If not set it defaults to terminal
 | |
| // width. A bar added to the container will inherit its width, unless
 | |
| // overridden by `func BarWidth(int) BarOption`.
 | |
| func WithWidth(width int) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.reqWidth = width
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithRefreshRate overrides default 150ms refresh rate.
 | |
| func WithRefreshRate(d time.Duration) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.refreshRate = d
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithManualRefresh disables internal auto refresh time.Ticker.
 | |
| // Refresh will occur upon receive value from provided ch.
 | |
| func WithManualRefresh(ch <-chan interface{}) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.manualRC = ch
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithRenderDelay delays rendering. By default rendering starts as
 | |
| // soon as bar is added, with this option it's possible to delay
 | |
| // rendering process by keeping provided chan unclosed. In other words
 | |
| // rendering will start as soon as provided chan is closed.
 | |
| func WithRenderDelay(ch <-chan struct{}) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.delayRC = ch
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithShutdownNotifier value of type `[]*mpb.Bar` will be send into provided
 | |
| // channel upon container shutdown.
 | |
| func WithShutdownNotifier(ch chan<- interface{}) ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.shutdownNotifier = ch
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithOutput overrides default os.Stdout output. If underlying io.Writer
 | |
| // is not a terminal then auto refresh is disabled unless WithAutoRefresh
 | |
| // option is set.
 | |
| func WithOutput(w io.Writer) ContainerOption {
 | |
| 	if w == nil {
 | |
| 		w = io.Discard
 | |
| 	}
 | |
| 	return func(s *pState) {
 | |
| 		s.output = w
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithDebugOutput sets debug output.
 | |
| func WithDebugOutput(w io.Writer) ContainerOption {
 | |
| 	if w == nil {
 | |
| 		w = io.Discard
 | |
| 	}
 | |
| 	return func(s *pState) {
 | |
| 		s.debugOut = w
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithAutoRefresh force auto refresh regardless of what output is set to.
 | |
| // Applicable only if not WithManualRefresh set.
 | |
| func WithAutoRefresh() ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.autoRefresh = true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // PopCompletedMode will pop completed bars to the top.
 | |
| // To stop rendering bar after it has been popped, use
 | |
| // mpb.BarRemoveOnComplete() option on that bar.
 | |
| func PopCompletedMode() ContainerOption {
 | |
| 	return func(s *pState) {
 | |
| 		s.popCompleted = true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ContainerOptional will return provided option only when cond is true.
 | |
| func ContainerOptional(option ContainerOption, cond bool) ContainerOption {
 | |
| 	if cond {
 | |
| 		return option
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // ContainerOptOn will return provided option only when predicate evaluates to true.
 | |
| func ContainerOptOn(option ContainerOption, predicate func() bool) ContainerOption {
 | |
| 	if predicate() {
 | |
| 		return option
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // ContainerFuncOptional will call option and return its value only when cond is true.
 | |
| func ContainerFuncOptional(option func() ContainerOption, cond bool) ContainerOption {
 | |
| 	if cond {
 | |
| 		return option()
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // ContainerFuncOptOn will call option and return its value only when predicate evaluates to true.
 | |
| func ContainerFuncOptOn(option func() ContainerOption, predicate func() bool) ContainerOption {
 | |
| 	if predicate() {
 | |
| 		return option()
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |