1package asset 2 3import ( 4 "errors" 5 "net/http" 6 "os" 7 "path/filepath" 8) 9 10// ListContents returns all paths inside the given filesystem; sub-directories 11// are also expanded. 12func ListContents(fs http.FileSystem, path string) ([]PathInfo, error) { 13 paths := []PathInfo{} 14 f, err := fs.Open(path) 15 if f == nil || err != nil { 16 return paths, err 17 } 18 s, err := f.Stat() 19 if err != nil { 20 return paths, err 21 } 22 if !s.IsDir() { 23 return paths, errors.New("expected path to be directory") 24 } 25 files, err := f.Readdir(-1) 26 defer f.Close() 27 if err != nil { 28 return paths, err 29 } 30 for _, file := range files { 31 fPath := filepath.Join(path, file.Name()) 32 if file.IsDir() { 33 sub, err := ListContents(fs, fPath) 34 if err != nil { 35 return paths, err 36 } 37 paths = append(paths, sub...) 38 } 39 paths = append(paths, PathInfo{Name: fPath, FileInfo: file}) 40 } 41 return paths, nil 42} 43 44// PathInfo includes the file descriptor of a path. 45type PathInfo struct { 46 os.FileInfo 47 Name string 48} 49