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