You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
1.4 KiB

9 years ago
9 years ago
  1. package common
  2. import (
  3. "bytes"
  4. "errors"
  5. "io"
  6. )
  7. type PrefixedReader struct {
  8. Prefix []byte
  9. reader io.Reader
  10. }
  11. func NewPrefixedReader(prefix []byte, reader io.Reader) *PrefixedReader {
  12. return &PrefixedReader{prefix, reader}
  13. }
  14. func (pr *PrefixedReader) Read(p []byte) (n int, err error) {
  15. if len(pr.Prefix) > 0 {
  16. read := copy(p, pr.Prefix)
  17. pr.Prefix = pr.Prefix[read:]
  18. return read, nil
  19. }
  20. return pr.reader.Read(p)
  21. }
  22. // NOTE: Not goroutine safe
  23. type BufferCloser struct {
  24. bytes.Buffer
  25. Closed bool
  26. }
  27. func NewBufferCloser(buf []byte) *BufferCloser {
  28. return &BufferCloser{
  29. *bytes.NewBuffer(buf),
  30. false,
  31. }
  32. }
  33. func (bc *BufferCloser) Close() error {
  34. if bc.Closed {
  35. return errors.New("BufferCloser already closed")
  36. }
  37. bc.Closed = true
  38. return nil
  39. }
  40. func (bc *BufferCloser) Write(p []byte) (n int, err error) {
  41. if bc.Closed {
  42. return 0, errors.New("Cannot write to closed BufferCloser")
  43. }
  44. return bc.Buffer.Write(p)
  45. }
  46. func (bc *BufferCloser) WriteByte(c byte) error {
  47. if bc.Closed {
  48. return errors.New("Cannot write to closed BufferCloser")
  49. }
  50. return bc.Buffer.WriteByte(c)
  51. }
  52. func (bc *BufferCloser) WriteRune(r rune) (n int, err error) {
  53. if bc.Closed {
  54. return 0, errors.New("Cannot write to closed BufferCloser")
  55. }
  56. return bc.Buffer.WriteRune(r)
  57. }
  58. func (bc *BufferCloser) WriteString(s string) (n int, err error) {
  59. if bc.Closed {
  60. return 0, errors.New("Cannot write to closed BufferCloser")
  61. }
  62. return bc.Buffer.WriteString(s)
  63. }