treefmt/walk/filesystem.go
Brian McGee 8b92dca9c6
feat: streaming processing of paths from stdin and paths argument
Signed-off-by: Brian McGee <brian@bmcgee.ie>
2024-05-07 17:20:04 +01:00

49 lines
851 B
Go

package walk
import (
"context"
"io/fs"
"path/filepath"
)
type filesystemWalker struct {
root string
pathsCh chan string
}
func (f filesystemWalker) Root() string {
return f.root
}
func (f filesystemWalker) Walk(_ context.Context, fn WalkFunc) error {
relPathOffset := len(f.root) + 1
relPathFn := func(path string) (relPath string) {
if len(path) >= relPathOffset {
relPath = path[relPathOffset:]
}
return
}
walkFn := func(path string, info fs.FileInfo, err error) error {
file := File{
Path: path,
RelPath: relPathFn(path),
Info: info,
}
return fn(&file, err)
}
for path := range f.pathsCh {
if err := filepath.Walk(path, walkFn); err != nil {
return err
}
}
return nil
}
func NewFilesystem(root string, paths chan string) (Walker, error) {
return filesystemWalker{root, paths}, nil
}