39 lines
630 B
Go
39 lines
630 B
Go
// Copyright 2022 Listware
|
|
|
|
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
type reusableReader struct {
|
|
io.Reader
|
|
readBuf *bytes.Buffer
|
|
backBuf *bytes.Buffer
|
|
}
|
|
|
|
func ReusableReader(r io.Reader) io.Reader {
|
|
readBuf := bytes.Buffer{}
|
|
readBuf.ReadFrom(r) // error handling ignored for brevity
|
|
backBuf := bytes.Buffer{}
|
|
|
|
return reusableReader{
|
|
io.TeeReader(&readBuf, &backBuf),
|
|
&readBuf,
|
|
&backBuf,
|
|
}
|
|
}
|
|
|
|
func (r reusableReader) Read(p []byte) (int, error) {
|
|
n, err := r.Reader.Read(p)
|
|
if err == io.EOF {
|
|
r.reset()
|
|
}
|
|
return n, err
|
|
}
|
|
|
|
func (r reusableReader) reset() {
|
|
io.Copy(r.readBuf, r.backBuf) // nolint: errcheck
|
|
}
|