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 }