github.com/bodgit/sevenzip@v1.5.1/internal/util/reader.go (about)

     1  package util
     2  
     3  import "io"
     4  
     5  // SizeReadSeekCloser is an io.Reader, io.Seeker, and io.Closer with a Size
     6  // method.
     7  type SizeReadSeekCloser interface {
     8  	io.Reader
     9  	io.Seeker
    10  	io.Closer
    11  	Size() int64
    12  }
    13  
    14  // Reader is both an io.Reader and io.ByteReader.
    15  type Reader interface {
    16  	io.Reader
    17  	io.ByteReader
    18  }
    19  
    20  // ReadCloser is a Reader that is also an io.Closer.
    21  type ReadCloser interface {
    22  	Reader
    23  	io.Closer
    24  }
    25  
    26  type nopCloser struct {
    27  	Reader
    28  }
    29  
    30  func (nopCloser) Close() error {
    31  	return nil
    32  }
    33  
    34  // NopCloser returns a ReadCloser with a no-op Close method wrapping the
    35  // provided Reader r.
    36  func NopCloser(r Reader) ReadCloser {
    37  	return &nopCloser{r}
    38  }
    39  
    40  type byteReadCloser struct {
    41  	io.ReadCloser
    42  }
    43  
    44  func (rc *byteReadCloser) ReadByte() (byte, error) {
    45  	var b [1]byte
    46  
    47  	n, err := rc.Read(b[:])
    48  	if err != nil {
    49  		return 0, err
    50  	}
    51  
    52  	if n == 0 {
    53  		return 0, io.ErrNoProgress
    54  	}
    55  
    56  	return b[0], nil
    57  }
    58  
    59  // ByteReadCloser returns a ReadCloser either by returning the io.ReadCloser
    60  // r if it implements the interface, or wrapping it with a ReadByte method.
    61  func ByteReadCloser(r io.ReadCloser) ReadCloser {
    62  	if rc, ok := r.(ReadCloser); ok {
    63  		return rc
    64  	}
    65  
    66  	return &byteReadCloser{r}
    67  }