github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/filesystem/fsutil/fs-http-func.go (about)

     1  package fsutil
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"net/http"
     7  	"os"
     8  	"time"
     9  )
    10  
    11  func NewHTTPFuncFS(f func(name string) (http.File, error)) http.FileSystem {
    12  	return HTTPFuncFS(f)
    13  }
    14  
    15  type HTTPFuncFS func(name string) (http.File, error)
    16  
    17  func (f HTTPFuncFS) Open(name string) (http.File, error) {
    18  	return f(name)
    19  }
    20  
    21  func NewHTTPBytesFile(name string, modTime time.Time, data []byte) *HTTPBytesFile {
    22  	return &HTTPBytesFile{
    23  		name:    name,
    24  		modTime: modTime,
    25  		Reader:  bytes.NewReader(data),
    26  	}
    27  }
    28  
    29  type HTTPBytesFile struct {
    30  	*bytes.Reader
    31  	name    string
    32  	modTime time.Time
    33  }
    34  
    35  func (f *HTTPBytesFile) Close() error {
    36  	return nil
    37  }
    38  
    39  func (f *HTTPBytesFile) Readdir(count int) ([]os.FileInfo, error) {
    40  	return nil, errors.New("HTTPBytesFile does not support Readdir()")
    41  }
    42  
    43  func (f *HTTPBytesFile) Stat() (os.FileInfo, error) {
    44  	return NewHTTPFileInfo(f.name, int64(f.Reader.Len()), os.FileMode(0644), f.modTime, nil), nil
    45  }
    46  
    47  func NewHTTPFileInfo(name string, size int64, mode os.FileMode, modTime time.Time, sys interface{}) *HTTPFileInfo {
    48  	return &HTTPFileInfo{
    49  		name:    name,
    50  		size:    size,
    51  		mode:    mode,
    52  		modTime: modTime,
    53  		sys:     sys,
    54  	}
    55  }
    56  
    57  // HTTPFileInfo implements os.FileInfo
    58  type HTTPFileInfo struct {
    59  	name    string
    60  	size    int64
    61  	mode    os.FileMode
    62  	modTime time.Time
    63  	isDir   bool
    64  	sys     interface{}
    65  }
    66  
    67  // Name returns the base name of the file
    68  func (i *HTTPFileInfo) Name() string { return i.name }
    69  
    70  // Size returns the length in bytes
    71  func (i *HTTPFileInfo) Size() int64 { return i.size }
    72  
    73  // Mode returns file mode bits
    74  func (i *HTTPFileInfo) Mode() os.FileMode { return i.mode }
    75  
    76  // ModTime returns the modification time
    77  func (i *HTTPFileInfo) ModTime() time.Time { return i.modTime }
    78  
    79  // IsDir is an abbreviation for Mode().IsDir()
    80  func (i *HTTPFileInfo) IsDir() bool { return i.mode.IsDir() }
    81  
    82  // Sys is underlying data source (can return nil)
    83  func (i *HTTPFileInfo) Sys() interface{} { return i.sys }