github.com/datreeio/datree@v1.9.22-rc/pkg/fileReader/reader.go (about) 1 package fileReader 2 3 import ( 4 "os" 5 "path/filepath" 6 "regexp" 7 8 "github.com/bmatcuk/doublestar/v2" 9 ) 10 11 type ReadFileFn = func(filename string) ([]byte, error) 12 type GlobFn = func(pattern string) ([]string, error) 13 type StatFn = func(name string) (os.FileInfo, error) 14 type AbsFn = func(path string) (string, error) 15 16 type FileReader struct { 17 readFile ReadFileFn 18 glob GlobFn 19 stat StatFn 20 abs AbsFn 21 } 22 23 type FileReaderOptions struct { 24 ReadFile ReadFileFn 25 Glob GlobFn 26 Stat StatFn 27 Abs AbsFn 28 } 29 30 func CreateFileReader(opts *FileReaderOptions) *FileReader { 31 fileReader := &FileReader{ 32 readFile: os.ReadFile, 33 glob: doublestar.Glob, 34 abs: filepath.Abs, 35 stat: os.Stat, 36 } 37 38 if opts != nil { 39 if opts.ReadFile != nil { 40 fileReader.readFile = opts.ReadFile 41 } 42 43 if opts.Glob != nil { 44 fileReader.glob = opts.Glob 45 } 46 47 if opts.Stat != nil { 48 fileReader.stat = opts.Stat 49 } 50 51 if opts.Abs != nil { 52 fileReader.abs = opts.Abs 53 } 54 } 55 56 return fileReader 57 } 58 59 func (fr *FileReader) FilterFiles(paths []string, excludePattern string) ([]string, error) { 60 var filePaths []string 61 62 excludeRegex, err := regexp.Compile(excludePattern) 63 if err != nil { 64 return nil, err 65 } 66 67 for _, path := range paths { 68 stat, err := fr.stat(path) 69 if err != nil { 70 return []string{}, err 71 } 72 73 isMatched := excludePattern != "" && excludeRegex.MatchString(path) 74 if !stat.IsDir() && !isMatched { 75 filePaths = append(filePaths, path) 76 } 77 } 78 79 return filePaths, nil 80 } 81 82 func (fr *FileReader) ReadFileContent(filepath string) (string, error) { 83 dat, err := fr.readFile(filepath) 84 if err != nil { 85 return "", err 86 } 87 88 return string(dat), nil 89 } 90 91 func (fr *FileReader) ReadDir(dirpath string) ([]string, error) { 92 stat, err := fr.stat(dirpath) 93 if err != nil { 94 return []string{}, err 95 } 96 if !stat.IsDir() { 97 return []string{}, nil 98 } 99 100 files, err := fr.glob(dirpath + "/**/*") 101 if err != nil { 102 return []string{}, err 103 } 104 105 return files, nil 106 } 107 108 func (fr *FileReader) GetFilename(path string) (string, error) { 109 stat, err := fr.stat(path) 110 if err != nil { 111 return "", err 112 } 113 114 if stat.IsDir() { 115 return "", nil 116 } 117 118 return stat.Name(), nil 119 }