|
|
- package common
-
- import (
- "bytes"
- "errors"
- "io"
- )
-
- type PrefixedReader struct {
- Prefix []byte
- reader io.Reader
- }
-
- func NewPrefixedReader(prefix []byte, reader io.Reader) *PrefixedReader {
- return &PrefixedReader{prefix, reader}
- }
-
- func (pr *PrefixedReader) Read(p []byte) (n int, err error) {
- if len(pr.Prefix) > 0 {
- read := copy(p, pr.Prefix)
- pr.Prefix = pr.Prefix[read:]
- return read, nil
- } else {
- return pr.reader.Read(p)
- }
- }
-
- // NOTE: Not goroutine safe
- type BufferCloser struct {
- bytes.Buffer
- Closed bool
- }
-
- func NewBufferCloser(buf []byte) *BufferCloser {
- return &BufferCloser{
- *bytes.NewBuffer(buf),
- false,
- }
- }
-
- func (bc *BufferCloser) Close() error {
- if bc.Closed {
- return errors.New("BufferCloser already closed")
- }
- bc.Closed = true
- return nil
- }
-
- func (bc *BufferCloser) Write(p []byte) (n int, err error) {
- if bc.Closed {
- return 0, errors.New("Cannot write to closed BufferCloser")
- }
- return bc.Buffer.Write(p)
- }
-
- func (bc *BufferCloser) WriteByte(c byte) error {
- if bc.Closed {
- return errors.New("Cannot write to closed BufferCloser")
- }
- return bc.Buffer.WriteByte(c)
- }
-
- func (bc *BufferCloser) WriteRune(r rune) (n int, err error) {
- if bc.Closed {
- return 0, errors.New("Cannot write to closed BufferCloser")
- }
- return bc.Buffer.WriteRune(r)
- }
-
- func (bc *BufferCloser) WriteString(s string) (n int, err error) {
- if bc.Closed {
- return 0, errors.New("Cannot write to closed BufferCloser")
- }
- return bc.Buffer.WriteString(s)
- }
|