1package pb 2 3import ( 4 "io" 5) 6 7// Reader it's a wrapper for given reader, but with progress handle 8type Reader struct { 9 io.Reader 10 bar *ProgressBar 11} 12 13// Read reads bytes from wrapped reader and add amount of bytes to progress bar 14func (r *Reader) Read(p []byte) (n int, err error) { 15 n, err = r.Reader.Read(p) 16 r.bar.Add(n) 17 return 18} 19 20// Close the wrapped reader when it implements io.Closer 21func (r *Reader) Close() (err error) { 22 r.bar.Finish() 23 if closer, ok := r.Reader.(io.Closer); ok { 24 return closer.Close() 25 } 26 return 27} 28 29// Writer it's a wrapper for given writer, but with progress handle 30type Writer struct { 31 io.Writer 32 bar *ProgressBar 33} 34 35// Write writes bytes to wrapped writer and add amount of bytes to progress bar 36func (r *Writer) Write(p []byte) (n int, err error) { 37 n, err = r.Writer.Write(p) 38 r.bar.Add(n) 39 return 40} 41 42// Close the wrapped reader when it implements io.Closer 43func (r *Writer) Close() (err error) { 44 r.bar.Finish() 45 if closer, ok := r.Writer.(io.Closer); ok { 46 return closer.Close() 47 } 48 return 49} 50