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  }