|
|
|
@ -13,7 +13,7 @@ import ( |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
fileTimestamp = time.Now() |
|
|
|
|
defaultFileTimestamp = time.Now() |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// FakeFile implements os.FileInfo interface for a given path and size
|
|
|
|
@ -24,6 +24,8 @@ type FakeFile struct { |
|
|
|
|
Dir bool |
|
|
|
|
// Len is the length of the fake file, zero if it is a directory
|
|
|
|
|
Len int64 |
|
|
|
|
// Timestamp is the ModTime of this file
|
|
|
|
|
Timestamp time.Time |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *FakeFile) Name() string { |
|
|
|
@ -40,7 +42,7 @@ func (f *FakeFile) Mode() os.FileMode { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *FakeFile) ModTime() time.Time { |
|
|
|
|
return fileTimestamp |
|
|
|
|
return f.Timestamp |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *FakeFile) Size() int64 { |
|
|
|
@ -62,11 +64,14 @@ type AssetFile struct { |
|
|
|
|
FakeFile |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewAssetFile(name string, content []byte) *AssetFile { |
|
|
|
|
func NewAssetFile(name string, content []byte, timestamp time.Time) *AssetFile { |
|
|
|
|
if timestamp.IsZero() { |
|
|
|
|
timestamp = defaultFileTimestamp |
|
|
|
|
} |
|
|
|
|
return &AssetFile{ |
|
|
|
|
bytes.NewReader(content), |
|
|
|
|
ioutil.NopCloser(nil), |
|
|
|
|
FakeFile{name, false, int64(len(content))}} |
|
|
|
|
FakeFile{name, false, int64(len(content)), timestamp}} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) { |
|
|
|
@ -92,13 +97,13 @@ func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirect |
|
|
|
|
fileinfos := make([]os.FileInfo, 0, len(children)) |
|
|
|
|
for _, child := range children { |
|
|
|
|
_, err := fs.AssetDir(filepath.Join(name, child)) |
|
|
|
|
fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0}) |
|
|
|
|
fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0, time.Time{}}) |
|
|
|
|
} |
|
|
|
|
return &AssetDirectory{ |
|
|
|
|
AssetFile{ |
|
|
|
|
bytes.NewReader(nil), |
|
|
|
|
ioutil.NopCloser(nil), |
|
|
|
|
FakeFile{name, true, 0}, |
|
|
|
|
FakeFile{name, true, 0, time.Time{}}, |
|
|
|
|
}, |
|
|
|
|
0, |
|
|
|
|
fileinfos} |
|
|
|
@ -127,6 +132,8 @@ type AssetFS struct { |
|
|
|
|
Asset func(path string) ([]byte, error) |
|
|
|
|
// AssetDir should return list of files in the path
|
|
|
|
|
AssetDir func(path string) ([]string, error) |
|
|
|
|
// AssetInfo should return the info of file in path if exists
|
|
|
|
|
AssetInfo func(path string) (os.FileInfo, error) |
|
|
|
|
// Prefix would be prepended to http requests
|
|
|
|
|
Prefix string |
|
|
|
|
} |
|
|
|
@ -137,7 +144,11 @@ func (fs *AssetFS) Open(name string) (http.File, error) { |
|
|
|
|
name = name[1:] |
|
|
|
|
} |
|
|
|
|
if b, err := fs.Asset(name); err == nil { |
|
|
|
|
return NewAssetFile(name, b), nil |
|
|
|
|
timestamp := defaultFileTimestamp |
|
|
|
|
if info, err := fs.AssetInfo(name); err == nil { |
|
|
|
|
timestamp = info.ModTime() |
|
|
|
|
} |
|
|
|
|
return NewAssetFile(name, b, timestamp), nil |
|
|
|
|
} |
|
|
|
|
if children, err := fs.AssetDir(name); err == nil { |
|
|
|
|
return NewAssetDirectory(name, children, fs), nil |
|
|
|
|