io.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package blob
  2. import "io"
  3. // Reader reads a Blob of up to 'length' bytes.
  4. type Reader interface {
  5. ReadBlob(length int) (blob Blob, n int, err error)
  6. }
  7. // ReaderAt reads a Blob of up to 'length' bytes starting from this reader's 'srcOffset'.
  8. type ReaderAt interface {
  9. ReadBlobAt(length int, srcOffset int64) (blob Blob, n int, err error)
  10. }
  11. // Writer writes 'src' to this writer.
  12. type Writer interface {
  13. WriteBlob(src Blob) (n int, err error)
  14. }
  15. // WriterAt writes 'src' to this writer starting at 'destOffset'.
  16. type WriterAt interface {
  17. WriteBlobAt(src Blob, destOffset int64) (n int, err error)
  18. }
  19. // Read reads 'src' into a new Blob up to length bytes. Attempts to use an optimized ReadBlob if available.
  20. func Read(src io.Reader, length int) (blob Blob, n int, err error) {
  21. if src, ok := src.(Reader); ok {
  22. return src.ReadBlob(length)
  23. }
  24. buf := make([]byte, length)
  25. n, err = src.Read(buf)
  26. return NewBytes(buf), n, err
  27. }
  28. // ReadAt reads 'src' into a new Blob up to length bytes starting at 'srcOffset'. Attempts to use an optimized ReadBlobAt if available.
  29. func ReadAt(src io.ReaderAt, length int, srcOffset int64) (blob Blob, n int, err error) {
  30. if src, ok := src.(ReaderAt); ok {
  31. return src.ReadBlobAt(length, srcOffset)
  32. }
  33. buf := make([]byte, length)
  34. n, err = src.ReadAt(buf, srcOffset)
  35. return NewBytes(buf), n, err
  36. }
  37. // Write writes 'src' into 'dest'. Attempts to use an optimized WriteBlob if available.
  38. func Write(dest io.Writer, src Blob) (n int, err error) {
  39. if dest, ok := dest.(Writer); ok {
  40. return dest.WriteBlob(src)
  41. }
  42. return dest.Write(src.Bytes())
  43. }
  44. // WriteAt writes 'src' into 'dest' starting at 'destOffset'. Attempts to use an optimized WriteBlobAt if available.
  45. func WriteAt(dest io.WriterAt, src Blob, destOffset int64) (n int, err error) {
  46. if dest, ok := dest.(WriterAt); ok {
  47. return dest.WriteBlobAt(src, destOffset)
  48. }
  49. return dest.WriteAt(src.Bytes(), destOffset)
  50. }