66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
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
|
|
}
|