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 }