| New file |
| | |
| | | // Package progress provides a proxy for download progress. |
| | | package progress |
| | | |
| | | import ( |
| | | "io" |
| | | "time" |
| | | |
| | | pb "github.com/gosuri/uiprogress" |
| | | ) |
| | | |
| | | // TODO: refactor to just check EOF |
| | | |
| | | // reader wrapping a progress bar. |
| | | type reader struct { |
| | | bars *pb.Progress |
| | | r io.ReadCloser |
| | | written int |
| | | } |
| | | |
| | | // Read implementation. |
| | | func (r *reader) Read(b []byte) (int, error) { |
| | | n, err := r.r.Read(b) |
| | | r.written += n |
| | | r.bars.Bars[0].Set(r.written) |
| | | return n, err |
| | | } |
| | | |
| | | // Close implementation. |
| | | func (r *reader) Close() error { |
| | | r.bars.Stop() |
| | | return r.r.Close() |
| | | } |
| | | |
| | | // Reader returns a progress bar reader. |
| | | func Reader(size int, r io.ReadCloser) io.ReadCloser { |
| | | bars := pb.New() |
| | | bars.Width = 50 |
| | | bars.AddBar(size) |
| | | bars.Start() |
| | | bars.SetRefreshInterval(50 * time.Millisecond) |
| | | bars.Bars[0].AppendCompleted() |
| | | |
| | | return &reader{ |
| | | bars: bars, |
| | | r: r, |
| | | } |
| | | } |