2019-01-24 20:15:10 +00:00
|
|
|
// Copyright (C) 2019 Storj Labs, Inc.
|
2018-06-05 15:00:48 +01:00
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
|
|
|
package utils
|
|
|
|
|
|
|
|
// ReaderSource takes a src func and turns it into an io.Reader
|
|
|
|
type ReaderSource struct {
|
|
|
|
src func() ([]byte, error)
|
|
|
|
buf []byte
|
|
|
|
err error
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewReaderSource makes a new ReaderSource
|
|
|
|
func NewReaderSource(src func() ([]byte, error)) *ReaderSource {
|
|
|
|
return &ReaderSource{src: src}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read implements io.Reader
|
|
|
|
func (rs *ReaderSource) Read(p []byte) (n int, err error) {
|
|
|
|
if rs.err != nil {
|
|
|
|
return 0, rs.err
|
|
|
|
}
|
|
|
|
if len(rs.buf) == 0 {
|
|
|
|
rs.buf, rs.err = rs.src()
|
|
|
|
}
|
|
|
|
|
|
|
|
n = copy(p, rs.buf)
|
|
|
|
rs.buf = rs.buf[n:]
|
|
|
|
return n, rs.err
|
|
|
|
}
|