// Package readers provides io.Reader related utilities.
package readers

import (
	"context"
	"io"
)

// NewContextReader creates a reader, that returns any errors that ctx gives
func NewContextReader(ctx context.Context, r io.Reader) io.Reader {
	return &contextReader{
		ctx: ctx,
		r:   r,
	}
}

type contextReader struct {
	ctx context.Context
	r   io.Reader
}

// Read bytes as per io.Reader interface
func (cr *contextReader) Read(p []byte) (n int, err error) {
	err = cr.ctx.Err()
	if err != nil {
		return 0, err
	}
	return cr.r.Read(p)
}