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 }