package pb import ( "io" ) // Reader it's a wrapper for given reader, but with progress handle type Reader struct { io.Reader bar *ProgressBar } // Read reads bytes from wrapped reader and add amount of bytes to progress bar func (r *Reader) Read(p []byte) (n int, err error) { n, err = r.Reader.Read(p) r.bar.Add(n) return } // Close the wrapped reader when it implements io.Closer func (r *Reader) Close() (err error) { r.bar.Finish() if closer, ok := r.Reader.(io.Closer); ok { return closer.Close() } return } // Writer it's a wrapper for given writer, but with progress handle type Writer struct { io.Writer bar *ProgressBar } // Write writes bytes to wrapped writer and add amount of bytes to progress bar func (r *Writer) Write(p []byte) (n int, err error) { n, err = r.Writer.Write(p) r.bar.Add(n) return } // Close the wrapped reader when it implements io.Closer func (r *Writer) Close() (err error) { r.bar.Finish() if closer, ok := r.Writer.(io.Closer); ok { return closer.Close() } return }