don't expose proxy reader struct
Vladimir Bauer
7 years ago
| 144 | 144 |
|
| 145 | 145 |
// ProxyReader allows progress tracking against provided io.Reader.
|
| 146 | 146 |
func (b *Bar) ProxyReader(r io.Reader) io.Reader {
|
| 147 | |
return &Reader{
|
| 148 | |
Reader: r,
|
| 149 | |
bar: b,
|
| 150 | |
}
|
|
147 |
return &proxyReader{r, b}
|
| 151 | 148 |
}
|
| 152 | 149 |
|
| 153 | 150 |
// ID returs id of the bar.
|
| 4 | 4 |
"time"
|
| 5 | 5 |
)
|
| 6 | 6 |
|
| 7 | |
// Reader is io.Reader wrapper, for proxy read bytes
|
| 8 | |
type Reader struct {
|
| 9 | |
io.Reader
|
| 10 | |
bar *Bar
|
|
7 |
// proxyReader is io.Reader wrapper, for proxy read bytes
|
|
8 |
type proxyReader struct {
|
|
9 |
r io.Reader
|
|
10 |
b *Bar
|
| 11 | 11 |
}
|
| 12 | 12 |
|
| 13 | |
func (r *Reader) Read(p []byte) (int, error) {
|
|
13 |
func (s *proxyReader) Read(p []byte) (n int, err error) {
|
| 14 | 14 |
start := time.Now()
|
| 15 | |
n, err := r.Reader.Read(p)
|
| 16 | |
r.bar.IncrBy(n, time.Since(start))
|
| 17 | |
return n, err
|
|
15 |
n, err = s.r.Read(p)
|
|
16 |
if n > 0 {
|
|
17 |
s.b.IncrBy(n, time.Since(start))
|
|
18 |
}
|
|
19 |
return
|
| 18 | 20 |
}
|
| 19 | 21 |
|
| 20 | |
// Close the reader when it implements io.Closer
|
| 21 | |
func (r *Reader) Close() error {
|
| 22 | |
if closer, ok := r.Reader.(io.Closer); ok {
|
|
22 |
func (s *proxyReader) Close() error {
|
|
23 |
if closer, ok := s.r.(io.Closer); ok {
|
| 23 | 24 |
return closer.Close()
|
| 24 | 25 |
}
|
| 25 | 26 |
return nil
|