github.com/influx6/npkg@v0.8.8/nfs/bytereaders/bytereaders.go (about) 1 package bytereaders 2 3 import ( 4 "bytes" 5 "errors" 6 "io" 7 "time" 8 9 filesystem "github.com/influx6/npkg/nfs" 10 ) 11 12 // ByteReaderFunc defines a type which returns a byte.Reader 13 // for a given string 14 type ByteReaderFunc func(string) (*bytes.Reader, int64, error) 15 16 // FileFromByteReader returns a nfs.GetFile function which returns 17 // a new nfs.File from provided bytes.Reader. 18 func FileFromByteReader(fn ByteReaderFunc) filesystem.GetFile { 19 return func(path string) (filesystem.File, error) { 20 reader, size, err := fn(path) 21 if err != nil { 22 return nil, err 23 } 24 25 return filesystem.NewVirtualFile(reader, path, size, time.Now()), nil 26 } 27 } 28 29 // ReaderFunc defines a type which returns a io.Reader 30 // for a given string 31 type ReaderFunc func(string) (io.Reader, int64, error) 32 33 // FileFromReader uses the ReaderFunc type to return a nfs.File 34 // from the returned reader if the type is either a nfs.VirtualFilesystem 35 // or a bytes.Reader. 36 func FileFromReader(fn ReaderFunc) filesystem.GetFile { 37 return func(path string) (filesystem.File, error) { 38 reader, size, err := fn(path) 39 if err != nil { 40 return nil, err 41 } 42 43 switch rreader := reader.(type) { 44 case filesystem.File: 45 return rreader, nil 46 case *filesystem.VirtualFile: 47 return rreader, nil 48 case *bytes.Reader: 49 return filesystem.NewVirtualFile(rreader, path, size, time.Now()), nil 50 default: 51 return nil, errors.New("Expected bytes.Reader type") 52 } 53 } 54 }