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  }