io.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package buf
  2. import (
  3. "io"
  4. "time"
  5. )
  6. // Reader extends io.Reader with MultiBuffer.
  7. type Reader interface {
  8. // ReadMultiBuffer reads content from underlying reader, and put it into a MultiBuffer.
  9. ReadMultiBuffer() (MultiBuffer, error)
  10. }
  11. // ErrReadTimeout is an error that happens with IO timeout.
  12. var ErrReadTimeout = newError("IO timeout")
  13. // TimeoutReader is a reader that returns error if Read() operation takes longer than the given timeout.
  14. type TimeoutReader interface {
  15. ReadTimeout(time.Duration) (MultiBuffer, error)
  16. }
  17. // Writer extends io.Writer with MultiBuffer.
  18. type Writer interface {
  19. // WriteMultiBuffer writes a MultiBuffer into underlying writer.
  20. WriteMultiBuffer(MultiBuffer) error
  21. }
  22. // ReadFrom creates a Supplier to read from a given io.Reader.
  23. func ReadFrom(reader io.Reader) Supplier {
  24. return func(b []byte) (int, error) {
  25. return reader.Read(b)
  26. }
  27. }
  28. // ReadFullFrom creates a Supplier to read full buffer from a given io.Reader.
  29. func ReadFullFrom(reader io.Reader, size int) Supplier {
  30. return func(b []byte) (int, error) {
  31. return io.ReadFull(reader, b[:size])
  32. }
  33. }
  34. // ReadAtLeastFrom create a Supplier to read at least size bytes from the given io.Reader.
  35. func ReadAtLeastFrom(reader io.Reader, size int) Supplier {
  36. return func(b []byte) (int, error) {
  37. return io.ReadAtLeast(reader, b, size)
  38. }
  39. }
  40. // NewReader creates a new Reader.
  41. // The Reader instance doesn't take the ownership of reader.
  42. func NewReader(reader io.Reader) Reader {
  43. if mr, ok := reader.(Reader); ok {
  44. return mr
  45. }
  46. return NewBytesToBufferReader(reader)
  47. }
  48. // NewWriter creates a new Writer.
  49. func NewWriter(writer io.Writer) Writer {
  50. if mw, ok := writer.(Writer); ok {
  51. return mw
  52. }
  53. return &BufferToBytesWriter{
  54. Writer: writer,
  55. }
  56. }
  57. // NewSequentialWriter returns a Writer that write Buffers in a MultiBuffer sequentially.
  58. func NewSequentialWriter(writer io.Writer) Writer {
  59. return &seqWriter{
  60. writer: writer,
  61. }
  62. }