Files
zampler/internal/scan.go
T
2026-07-16 00:33:50 +01:00

71 lines
1.1 KiB
Go

package internal
import (
"errors"
"maps"
"os"
"path"
)
func MultiScan(rootDirs ...string) (Files, error) {
files := Files{}
for _, rootDir := range rootDirs {
moreFiles, err := Scan(rootDir)
if err != nil {
return nil, err
}
maps.Copy(files, moreFiles)
}
return files, nil
}
func Scan(rootDir string) (Files, error) {
if !path.IsAbs(rootDir) {
return nil, errors.New("rootDir must be absolute path")
}
paths, err := scanRecursive(rootDir)
if err != nil {
return nil, err
}
l := len(rootDir)
files := Files{}
for _, path := range paths {
files[path] = &File{
RootDir: rootDir,
Path: path[l:],
}
}
return files, nil
}
func scanRecursive(dir string) ([]string, error) {
paths := []string{}
entries, err := os.ReadDir(dir)
if err != nil {
return nil, err
}
for _, entry := range entries {
path := path.Join(dir, entry.Name())
if entry.IsDir() {
subPaths, err := scanRecursive(path)
if err != nil {
return nil, err
}
paths = append(paths, subPaths...)
} else {
paths = append(paths, path)
}
}
return paths, nil
}