reader.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 bufferToBytesReader struct {
  22. stream Reader
  23. current MultiBuffer
  24. err error
  25. }
  26. // fill fills in the internal buffer.
  27. func (v *bufferToBytesReader) fill() {
  28. b, err := v.stream.Read()
  29. if err != nil {
  30. v.err = err
  31. return
  32. }
  33. v.current = b
  34. }
  35. func (v *bufferToBytesReader) Read(b []byte) (int, error) {
  36. if v.err != nil {
  37. return 0, v.err
  38. }
  39. if v.current == nil {
  40. v.fill()
  41. if v.err != nil {
  42. return 0, v.err
  43. }
  44. }
  45. nBytes, err := v.current.Read(b)
  46. if v.current.IsEmpty() {
  47. v.current.Release()
  48. v.current = nil
  49. }
  50. return nBytes, err
  51. }