github.com/khulnasoft/cli@v0.0.0-20240402070845-01bcad7beefa/cli/context/store/io_utils.go (about)

     1  package store
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  )
     7  
     8  // LimitedReader is a fork of io.LimitedReader to override Read.
     9  type LimitedReader struct {
    10  	R io.Reader
    11  	N int64 // max bytes remaining
    12  }
    13  
    14  // Read is a fork of io.LimitedReader.Read that returns an error when limit exceeded.
    15  func (l *LimitedReader) Read(p []byte) (n int, err error) {
    16  	if l.N < 0 {
    17  		return 0, errors.New("read exceeds the defined limit")
    18  	}
    19  	if l.N == 0 {
    20  		return 0, io.EOF
    21  	}
    22  	// have to cap N + 1 otherwise we won't hit limit err
    23  	if int64(len(p)) > l.N+1 {
    24  		p = p[0 : l.N+1]
    25  	}
    26  	n, err = l.R.Read(p)
    27  	l.N -= int64(n)
    28  	return n, err
    29  }