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  }