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  }