reader.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package asyncbuffer
  2. import (
  3. "errors"
  4. "io"
  5. )
  6. // Underlying Reader that provides io.ReadSeeker interface for the actual data reading
  7. // What is the purpose of this Reader?
  8. type Reader struct {
  9. ab *AsyncBuffer
  10. pos int64
  11. }
  12. // Read reads data from the AsyncBuffer.
  13. func (r *Reader) Read(p []byte) (int, error) {
  14. n, err := r.ab.readAt(p, r.pos)
  15. if err == nil {
  16. r.pos += int64(n)
  17. }
  18. return n, err
  19. }
  20. // Seek sets the position of the reader to the given offset and returns the new position
  21. func (r *Reader) Seek(offset int64, whence int) (int64, error) {
  22. switch whence {
  23. case io.SeekStart:
  24. r.pos = offset
  25. case io.SeekCurrent:
  26. r.pos += offset
  27. case io.SeekEnd:
  28. size := r.ab.dataLen
  29. if size <= 0 {
  30. var err error
  31. if size, err = r.ab.Wait(); err != nil {
  32. return 0, err
  33. }
  34. }
  35. r.pos = int64(size) + offset
  36. default:
  37. return 0, errors.New("asyncbuffer.AsyncBuffer.ReadAt: invalid whence")
  38. }
  39. if r.pos < 0 {
  40. return 0, errors.New("asyncbuffer.AsyncBuffer.ReadAt: negative position")
  41. }
  42. return r.pos, nil
  43. }