github.com/qiniu/go-sdk/v7@v7.27.0/internal/io/nopcloser.go (about) 1 package io 2 3 import ( 4 "bytes" 5 "io" 6 ) 7 8 type KnownLength interface { 9 DetectLength() (int64, error) 10 } 11 12 type ReadSeekableNopCloser struct { 13 r io.ReadSeeker 14 } 15 16 func NewReadSeekableNopCloser(r io.ReadSeeker) ReadSeekableNopCloser { 17 return ReadSeekableNopCloser{r: r} 18 } 19 20 func (nc ReadSeekableNopCloser) Read(p []byte) (int, error) { 21 return nc.r.Read(p) 22 } 23 24 func (nc ReadSeekableNopCloser) Seek(offset int64, whence int) (int64, error) { 25 return nc.r.Seek(offset, whence) 26 } 27 28 func (nc ReadSeekableNopCloser) DetectLength() (int64, error) { 29 if kl, ok := nc.r.(KnownLength); ok { 30 return kl.DetectLength() 31 } 32 cur, err := nc.r.Seek(0, io.SeekCurrent) 33 if err != nil { 34 return 0, err 35 } 36 length, err := nc.r.Seek(0, io.SeekEnd) 37 if err != nil { 38 return 0, err 39 } 40 _, err = nc.r.Seek(cur, io.SeekStart) 41 if err != nil { 42 return 0, err 43 } 44 return length, nil 45 } 46 47 func (nc ReadSeekableNopCloser) Close() error { 48 return nil 49 } 50 51 type BytesNopCloser struct { 52 r *bytes.Reader 53 b []byte 54 } 55 56 func NewBytesNopCloser(b []byte) *BytesNopCloser { 57 return &BytesNopCloser{r: bytes.NewReader(b), b: b} 58 } 59 60 func (nc *BytesNopCloser) Read(p []byte) (int, error) { 61 return nc.r.Read(p) 62 } 63 64 func (nc *BytesNopCloser) ReadAt(b []byte, off int64) (int, error) { 65 return nc.r.ReadAt(b, off) 66 } 67 68 func (nc *BytesNopCloser) Seek(offset int64, whence int) (int64, error) { 69 return nc.r.Seek(offset, whence) 70 } 71 72 func (nc *BytesNopCloser) DetectLength() (int64, error) { 73 return nc.Size(), nil 74 } 75 76 func (nc *BytesNopCloser) Size() int64 { 77 return nc.r.Size() 78 } 79 80 func (nc *BytesNopCloser) Close() error { 81 return nil 82 } 83 84 func (nc *BytesNopCloser) Bytes() []byte { 85 return nc.b 86 }