storj.io/uplink@v1.13.0/private/storage/streams/eof.go (about) 1 // Copyright (C) 2019 Storj Labs, Inc. 2 // See LICENSE for copying information. 3 4 package streams 5 6 import ( 7 "errors" 8 "io" 9 ) 10 11 // EOFReader holds reader and status of EOF. 12 type EOFReader struct { 13 reader io.Reader 14 eof bool 15 err error 16 } 17 18 // NewEOFReader keeps track of the state, has the internal reader reached EOF. 19 func NewEOFReader(r io.Reader) *EOFReader { 20 return &EOFReader{reader: r} 21 } 22 23 func (r *EOFReader) Read(p []byte) (n int, err error) { 24 n, err = r.reader.Read(p) 25 if errors.Is(err, io.EOF) { 26 r.eof = true 27 } else if err != nil && r.err == nil { 28 r.err = err 29 } 30 return n, err 31 } 32 33 // IsEOF returns true if EOF was returned during reading. 34 func (r *EOFReader) IsEOF() bool { 35 return r.eof 36 } 37 38 // HasError returns true if error was returned during reading. 39 func (r *EOFReader) HasError() bool { 40 return r.err != nil 41 }