62
package dir
import (
"errors"
"io"
"io/fs"
"net/http"
"path/filepath"
"sophuwu.site/cdn/fileserver"
)
func Open(path string) func(string) ([]byte, []fileserver.DirEntry, error) {
d := Dir{http.Dir(path)}
return d.GetEntry
}
type Dir struct {
H http.FileSystem
}
type DirEntry = fileserver.DirEntry
func (d *Dir) GetEntry(path string) (data []byte, items []DirEntry, err error) {
var f http.File
f, err = d.H.Open(path)
if err != nil {
return
}
var fi fs.FileInfo
fi, err = f.Stat()
if err != nil {
return
}
if fi.IsDir() {
var de []fs.FileInfo
de, err = f.Readdir(0)
if err != nil {
return
}
items = []DirEntry{}
for _, d := range de {
items = append(items, DirEntry{
Name: d.Name() + func() string {
if d.IsDir() {
return "/"
}
return ""
}(),
FullName: filepath.Join(path, d.Name()),
Size: int(d.Size()),
IsDir: d.IsDir(),
})
}
return
}
if fi.Mode().IsRegular() {
data, err = io.ReadAll(f)
return
}
err = errors.New("not a regular file")
return
}