9 type PrefixedReader struct {
14 func NewPrefixedReader(prefix []byte, reader io.Reader) *PrefixedReader {
15 return &PrefixedReader{prefix, reader}
18 func (pr *PrefixedReader) Read(p []byte) (n int, err error) {
19 if len(pr.Prefix) > 0 {
20 read := copy(p, pr.Prefix)
21 pr.Prefix = pr.Prefix[read:]
24 return pr.reader.Read(p)
28 // NOTE: Not goroutine safe
29 type BufferCloser struct {
34 func NewBufferCloser(buf []byte) *BufferCloser {
36 *bytes.NewBuffer(buf),
41 func (bc *BufferCloser) Close() error {
43 return errors.New("BufferCloser already closed")
49 func (bc *BufferCloser) Write(p []byte) (n int, err error) {
51 return 0, errors.New("Cannot write to closed BufferCloser")
53 return bc.Buffer.Write(p)
56 func (bc *BufferCloser) WriteByte(c byte) error {
58 return errors.New("Cannot write to closed BufferCloser")
60 return bc.Buffer.WriteByte(c)
63 func (bc *BufferCloser) WriteRune(r rune) (n int, err error) {
65 return 0, errors.New("Cannot write to closed BufferCloser")
67 return bc.Buffer.WriteRune(r)
70 func (bc *BufferCloser) WriteString(s string) (n int, err error) {
72 return 0, errors.New("Cannot write to closed BufferCloser")
74 return bc.Buffer.WriteString(s)