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.

75 lines
1.4 KiB

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. } else {
  20. return pr.reader.Read(p)
  21. }
  22. }
  23. // NOTE: Not goroutine safe
  24. type BufferCloser struct {
  25. bytes.Buffer
  26. Closed bool
  27. }
  28. func NewBufferCloser(buf []byte) *BufferCloser {
  29. return &BufferCloser{
  30. *bytes.NewBuffer(buf),
  31. false,
  32. }
  33. }
  34. func (bc *BufferCloser) Close() error {
  35. if bc.Closed {
  36. return errors.New("BufferCloser already closed")
  37. }
  38. bc.Closed = true
  39. return nil
  40. }
  41. func (bc *BufferCloser) Write(p []byte) (n int, err error) {
  42. if bc.Closed {
  43. return 0, errors.New("Cannot write to closed BufferCloser")
  44. }
  45. return bc.Buffer.Write(p)
  46. }
  47. func (bc *BufferCloser) WriteByte(c byte) error {
  48. if bc.Closed {
  49. return errors.New("Cannot write to closed BufferCloser")
  50. }
  51. return bc.Buffer.WriteByte(c)
  52. }
  53. func (bc *BufferCloser) WriteRune(r rune) (n int, err error) {
  54. if bc.Closed {
  55. return 0, errors.New("Cannot write to closed BufferCloser")
  56. }
  57. return bc.Buffer.WriteRune(r)
  58. }
  59. func (bc *BufferCloser) WriteString(s string) (n int, err error) {
  60. if bc.Closed {
  61. return 0, errors.New("Cannot write to closed BufferCloser")
  62. }
  63. return bc.Buffer.WriteString(s)
  64. }