github.com/qiniu/go-sdk/v7@v7.27.0/internal/io/compatible.go (about) 1 package io 2 3 import ( 4 "errors" 5 "io" 6 "syscall" 7 ) 8 9 func MakeReadSeekCloserFromReader(r io.Reader) ReadSeekCloser { 10 return &readSeekCloserFromReader{r: r} 11 } 12 13 type readSeekCloserFromReader struct { 14 r io.Reader 15 } 16 17 func (r *readSeekCloserFromReader) Read(p []byte) (int, error) { 18 return r.r.Read(p) 19 } 20 21 func (r *readSeekCloserFromReader) Seek(offset int64, whence int) (int64, error) { 22 if seeker, ok := r.r.(io.Seeker); ok { 23 return seeker.Seek(offset, whence) 24 } 25 return 0, syscall.ESPIPE 26 } 27 28 func (r *readSeekCloserFromReader) Close() error { 29 return nil 30 } 31 32 func MakeReadSeekCloserFromLimitedReader(r io.Reader, size int64) ReadSeekCloser { 33 return &sizedReadSeekCloserFromReader{r: io.LimitedReader{R: r, N: size}, size: size} 34 } 35 36 type sizedReadSeekCloserFromReader struct { 37 r io.LimitedReader 38 size int64 39 } 40 41 func (r *sizedReadSeekCloserFromReader) Read(p []byte) (int, error) { 42 return r.r.Read(p) 43 } 44 45 func (r *sizedReadSeekCloserFromReader) Seek(offset int64, whence int) (int64, error) { 46 if seeker, ok := r.r.R.(io.ReadSeeker); ok { 47 newPos, err := seeker.Seek(offset, whence) 48 if err != nil { 49 return newPos, err 50 } 51 r.r.N = r.size - newPos 52 return newPos, nil 53 } 54 return 0, errors.New("not support seek") 55 } 56 57 func (r *sizedReadSeekCloserFromReader) Close() error { 58 return nil 59 } 60 61 func (r *sizedReadSeekCloserFromReader) DetectLength() (int64, error) { 62 return r.size, nil 63 }