reader.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package buf
  2. import "io"
  3. // BytesToBufferReader is a Reader that adjusts its reading speed automatically.
  4. type BytesToBufferReader struct {
  5. reader io.Reader
  6. buffer *Buffer
  7. }
  8. // Read implements Reader.Read().
  9. func (v *BytesToBufferReader) Read() (MultiBuffer, error) {
  10. if err := v.buffer.Reset(ReadFrom(v.reader)); err != nil {
  11. return nil, err
  12. }
  13. mb := NewMultiBuffer()
  14. for !v.buffer.IsEmpty() {
  15. b := New()
  16. b.AppendSupplier(ReadFrom(v.buffer))
  17. mb.Append(b)
  18. }
  19. return mb, nil
  20. }
  21. type readerAdpater struct {
  22. MultiBufferReader
  23. }
  24. func (r *readerAdpater) Read() (MultiBuffer, error) {
  25. return r.ReadMultiBuffer()
  26. }
  27. type bufferToBytesReader struct {
  28. stream Reader
  29. current MultiBuffer
  30. err error
  31. }
  32. // fill fills in the internal buffer.
  33. func (v *bufferToBytesReader) fill() {
  34. b, err := v.stream.Read()
  35. if err != nil {
  36. v.err = err
  37. return
  38. }
  39. v.current = b
  40. }
  41. func (v *bufferToBytesReader) Read(b []byte) (int, error) {
  42. if v.err != nil {
  43. return 0, v.err
  44. }
  45. if v.current == nil {
  46. v.fill()
  47. if v.err != nil {
  48. return 0, v.err
  49. }
  50. }
  51. nBytes, err := v.current.Read(b)
  52. if v.current.IsEmpty() {
  53. v.current.Release()
  54. v.current = nil
  55. }
  56. return nBytes, err
  57. }
  58. func (v *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
  59. if v.err != nil {
  60. return nil, v.err
  61. }
  62. if v.current == nil {
  63. v.fill()
  64. if v.err != nil {
  65. return nil, v.err
  66. }
  67. }
  68. b := v.current
  69. v.current = nil
  70. return b, nil
  71. }