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 }