github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/filesystem/fsutil/fs-http-bindata.go (about) 1 package fsutil 2 3 import ( 4 "bytes" 5 "net/http" 6 "os" 7 "path" 8 "strings" 9 "syscall" 10 ) 11 12 type AssetFunc func(path string) ([]byte, error) 13 type AssetDirFunc func(path string) ([]string, error) 14 type AssetInfoFunc func(path string) (os.FileInfo, error) 15 16 type HTTPBindataFs struct { 17 AssetFunc 18 AssetDirFunc 19 AssetInfoFunc 20 Prepend string // require this in front of a name request in order to satisfy it (i.e. make it appear like all files are under this dir) 21 } 22 23 func (fs *HTTPBindataFs) Open(name string) (http.File, error) { 24 25 name = strings.TrimPrefix(path.Clean("/"+name), "/") 26 name = strings.TrimPrefix(path.Clean("/"+strings.TrimPrefix(name, fs.Prepend)), "/") 27 28 data, err := fs.AssetFunc(name) 29 if err != nil { 30 return nil, err 31 } 32 return &HTTPBindataFile{name: name, Reader: bytes.NewReader(data), fs: fs}, nil 33 } 34 35 type HTTPBindataFile struct { 36 name string 37 *bytes.Reader 38 fs *HTTPBindataFs 39 } 40 41 func (f *HTTPBindataFile) Close() error { return nil } 42 43 func (f *HTTPBindataFile) Name() string { return f.name } 44 45 func (f *HTTPBindataFile) Readdir(int) ([]os.FileInfo, error) { 46 return nil, &os.SyscallError{ 47 Syscall: "readdirent", 48 Err: syscall.EINVAL, 49 } 50 } 51 52 func (f *HTTPBindataFile) Stat() (os.FileInfo, error) { return f.fs.AssetInfoFunc(f.name) } 53 54 var _ http.File = &HTTPBindataFile{}