package store

import (
	"errors"
	"io"
)

// LimitedReader is a fork of io.LimitedReader to override Read.
type LimitedReader struct {
	R io.Reader
	N int64 // max bytes remaining
}

// Read is a fork of io.LimitedReader.Read that returns an error when limit exceeded.
func (l *LimitedReader) Read(p []byte) (n int, err error) {
	if l.N < 0 {
		return 0, errors.New("read exceeds the defined limit")
	}
	if l.N == 0 {
		return 0, io.EOF
	}
	// have to cap N + 1 otherwise we won't hit limit err
	if int64(len(p)) > l.N+1 {
		p = p[0 : l.N+1]
	}
	n, err = l.R.Read(p)
	l.N -= int64(n)
	return n, err
}
