github.com/mgoltzsche/ctnr@v0.7.1-alpha/pkg/fs/reader.go (about)

     1  package fs
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  
     7  	"github.com/openSUSE/umoci/pkg/fseval"
     8  	"github.com/pkg/errors"
     9  )
    10  
    11  type fileReader struct {
    12  	file   string
    13  	fsEval fseval.FsEval
    14  }
    15  
    16  func NewFileReader(file string, fsEval fseval.FsEval) *fileReader {
    17  	return &fileReader{file, fsEval}
    18  }
    19  
    20  func (f *fileReader) Reader() (r io.ReadCloser, err error) {
    21  	r, err = f.fsEval.Open(f.file)
    22  	err = errors.Wrap(err, "file reader")
    23  	return
    24  }
    25  
    26  func (f *fileReader) String() string {
    27  	return f.file
    28  }
    29  
    30  type readable struct {
    31  	r    io.Reader
    32  	read bool
    33  }
    34  
    35  func NewReadable(r io.Reader) Readable {
    36  	return &readable{r, false}
    37  }
    38  
    39  func (r *readable) Reader() (io.ReadCloser, error) {
    40  	if r.read {
    41  		return nil, errors.Errorf("reader: already read")
    42  	}
    43  	r.read = true
    44  	return r, nil
    45  }
    46  
    47  func (r *readable) Read(p []byte) (int, error) {
    48  	return r.r.Read(p)
    49  }
    50  
    51  func (_ *readable) Close() error {
    52  	return nil
    53  }
    54  
    55  type readablebytes struct {
    56  	r *bytes.Reader
    57  }
    58  
    59  func NewReadableBytes(b []byte) Readable {
    60  	return &readablebytes{bytes.NewReader(b)}
    61  }
    62  
    63  func (r *readablebytes) Reader() (io.ReadCloser, error) {
    64  	r.r.Seek(0, 0)
    65  	return r, nil
    66  }
    67  
    68  func (r *readablebytes) Read(p []byte) (int, error) {
    69  	return r.r.Read(p)
    70  }
    71  
    72  func (_ *readablebytes) Close() error {
    73  	return nil
    74  }