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  }