// 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 }