io.go 1.0 KB

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