buildr/modules/plugin/fs.go

66 lines
1.2 KiB
Go
Raw Permalink Normal View History

package plugin
import (
"io/fs"
"os"
"strings"
)
var (
_ fs.FS = (*multiDirFS)(nil)
_ fs.ReadDirFS = (*multiDirFS)(nil)
_ fs.ReadFileFS = (*multiDirFS)(nil)
_ fs.StatFS = (*multiDirFS)(nil)
)
func newMultiDirFS(paths ...string) multiDirFS {
mdfs := make(multiDirFS, len(paths))
for i := range paths {
mdfs[paths[i]] = os.DirFS(paths[i])
}
return mdfs
}
type multiDirFS map[string]fs.FS
func (m multiDirFS) Open(name string) (fs.File, error) {
for base, pathFS := range m {
if strings.HasPrefix(name, base) {
return pathFS.Open(name)
}
}
return nil, fs.ErrNotExist
}
func (m multiDirFS) Stat(name string) (fs.FileInfo, error) {
for base, pathFS := range m {
if strings.HasPrefix(name, base) {
return fs.Stat(pathFS, name)
}
}
return nil, fs.ErrNotExist
}
func (m multiDirFS) ReadDir(name string) ([]fs.DirEntry, error) {
for base, pathFS := range m {
if strings.HasPrefix(name, base) {
return fs.ReadDir(pathFS, name)
}
}
return nil, fs.ErrNotExist
}
func (m multiDirFS) ReadFile(name string) ([]byte, error) {
for base, pathFS := range m {
if strings.HasPrefix(name, base) {
return fs.ReadFile(pathFS, name)
}
}
return nil, fs.ErrNotExist
}