github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/internal/progressreader/progressreader.go (about)

     1  // Package progressreader provides an io.Reader progress bar.
     2  package progressreader
     3  
     4  import (
     5  	"io"
     6  	"sync"
     7  
     8  	"github.com/apex/up/internal/util"
     9  	"github.com/tj/go-progress"
    10  	"github.com/tj/go/term"
    11  )
    12  
    13  // reader wrapping a progress bar.
    14  type reader struct {
    15  	io.ReadCloser
    16  	p       *progress.Bar
    17  	render  func(string)
    18  	written int
    19  	sync.Once
    20  }
    21  
    22  // Read implementation.
    23  func (r *reader) Read(b []byte) (int, error) {
    24  	r.Do(term.ClearAll)
    25  	n, err := r.ReadCloser.Read(b)
    26  	r.written += n
    27  	r.p.ValueInt(r.written)
    28  	r.render(term.CenterLine(r.p.String()))
    29  	return n, err
    30  }
    31  
    32  // New returns a progress bar reader.
    33  func New(size int, r io.ReadCloser) io.ReadCloser {
    34  	return &reader{
    35  		ReadCloser: r,
    36  		p:          util.NewProgressInt(size),
    37  		render:     term.Renderer(),
    38  	}
    39  }