package packr import ( "os" "path/filepath" "strings" "github.com/pkg/errors" ) type WalkFunc func(string, File) error // Walk will traverse the box and call the WalkFunc for each file in the box/folder. func (b Box) Walk(wf WalkFunc) error { if data[b.Path] == nil { base, err := filepath.EvalSymlinks(filepath.Join(b.callingDir, b.Path)) if err != nil { return errors.WithStack(err) } return filepath.Walk(base, func(path string, info os.FileInfo, err error) error { cleanName, err := filepath.Rel(base, path) if err != nil { cleanName = strings.TrimPrefix(path, base) } cleanName = filepath.ToSlash(filepath.Clean(cleanName)) cleanName = strings.TrimPrefix(cleanName, "/") cleanName = filepath.FromSlash(cleanName) if info == nil || info.IsDir() { return nil } file, err := fileFor(path, cleanName) if err != nil { return err } return wf(cleanName, file) }) } for n := range data[b.Path] { f, err := b.find(n) if err != nil { return err } err = wf(n, f) if err != nil { return err } } return nil } // WalkPrefix will call box.Walk and call the WalkFunc when it finds paths that have a matching prefix func (b Box) WalkPrefix(prefix string, wf WalkFunc) error { opre := osPath(prefix) return b.Walk(func(path string, f File) error { if strings.HasPrefix(osPath(path), opre) { if err := wf(path, f); err != nil { return errors.WithStack(err) } } return nil }) }