Codebase list golang-github-vbauerster-mpb / e8bc882
fix io.NopCloser issue io.NopCloser in go 1.18 and below doesn't check for io.WriterTo Vladimir Bauer 3 years ago
1 changed file(s) with 33 addition(s) and 6 deletion(s). Raw diff Collapse all Expand all
55 )
66
77 type proxyReader struct {
8 io.ReadCloser
8 io.Reader
99 bar *Bar
1010 }
1111
1212 func (x proxyReader) Read(p []byte) (int, error) {
13 n, err := x.ReadCloser.Read(p)
13 n, err := x.Reader.Read(p)
1414 x.bar.IncrBy(n)
1515 return n, err
1616 }
2020 }
2121
2222 func (x proxyWriterTo) WriteTo(w io.Writer) (int64, error) {
23 n, err := x.ReadCloser.(io.WriterTo).WriteTo(w)
23 n, err := x.Reader.(io.WriterTo).WriteTo(w)
2424 x.bar.IncrInt64(n)
2525 return n, err
2626 }
4444
4545 func (x ewmaProxyWriterTo) WriteTo(w io.Writer) (int64, error) {
4646 start := time.Now()
47 n, err := x.ReadCloser.(io.WriterTo).WriteTo(w)
47 n, err := x.Reader.(io.WriterTo).WriteTo(w)
4848 if n > 0 {
4949 x.bar.DecoratorEwmaUpdate(time.Since(start))
5050 }
5252 }
5353
5454 func (b *Bar) newProxyReader(r io.Reader, hasEwma bool) io.ReadCloser {
55 pr := proxyReader{toReadCloser(r), b}
55 return toReadCloser(toReader(r, b, hasEwma))
56 }
57
58 func toReader(r io.Reader, b *Bar, hasEwma bool) io.Reader {
59 pr := proxyReader{r, b}
5660 if hasEwma {
5761 epr := ewmaProxyReader{pr}
5862 if _, ok := r.(io.WriterTo); ok {
7074 if rc, ok := r.(io.ReadCloser); ok {
7175 return rc
7276 }
73 return io.NopCloser(r)
77 return toNopCloser(r)
7478 }
79
80 func toNopCloser(r io.Reader) io.ReadCloser {
81 if _, ok := r.(io.WriterTo); ok {
82 return nopCloserWriterTo{r}
83 }
84 return nopCloser{r}
85 }
86
87 type nopCloser struct {
88 io.Reader
89 }
90
91 func (nopCloser) Close() error { return nil }
92
93 type nopCloserWriterTo struct {
94 io.Reader
95 }
96
97 func (nopCloserWriterTo) Close() error { return nil }
98
99 func (c nopCloserWriterTo) WriteTo(w io.Writer) (n int64, err error) {
100 return c.Reader.(io.WriterTo).WriteTo(w)
101 }