github.com/daixiang0/gci@v0.13.0/pkg/io/search.go (about)

     1  package io
     2  
     3  import (
     4  	"io/fs"
     5  	"os"
     6  	"path/filepath"
     7  )
     8  
     9  type fileCheckFunction func(path string, file os.FileInfo) bool
    10  
    11  func FindFilesForPath(path string, fileCheckFun fileCheckFunction) ([]string, error) {
    12  	switch entry, err := os.Stat(path); {
    13  	case err != nil:
    14  		return nil, err
    15  	case entry.IsDir():
    16  		return findFilesForDirectory(path, fileCheckFun)
    17  	case fileCheckFun(path, entry):
    18  		return []string{filepath.Clean(path)}, nil
    19  	default:
    20  		return []string{}, nil
    21  	}
    22  }
    23  
    24  func findFilesForDirectory(dirPath string, fileCheckFun fileCheckFunction) ([]string, error) {
    25  	var filePaths []string
    26  	err := filepath.WalkDir(dirPath, func(path string, entry fs.DirEntry, err error) error {
    27  		if err != nil {
    28  			return err
    29  		}
    30  		file, err := entry.Info()
    31  		if err != nil {
    32  			return err
    33  		}
    34  		if !entry.IsDir() && fileCheckFun(path, file) {
    35  			filePaths = append(filePaths, filepath.Clean(path))
    36  		}
    37  		return nil
    38  	})
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  	return filePaths, nil
    43  }
    44  
    45  func isGoFile(_ string, file os.FileInfo) bool {
    46  	return !file.IsDir() && filepath.Ext(file.Name()) == ".go"
    47  }
    48  
    49  func isOutsideVendorDir(path string, _ os.FileInfo) bool {
    50  	for {
    51  		base := filepath.Base(path)
    52  		if base == "vendor" {
    53  			return false
    54  		}
    55  
    56  		prevPath := path
    57  		path = filepath.Dir(path)
    58  
    59  		if prevPath == path {
    60  			break
    61  		}
    62  	}
    63  
    64  	return true
    65  }
    66  
    67  func checkChains(funcs ...fileCheckFunction) fileCheckFunction {
    68  	return func(path string, file os.FileInfo) bool {
    69  		for _, checkFunc := range funcs {
    70  			if !checkFunc(path, file) {
    71  				return false
    72  			}
    73  		}
    74  
    75  		return true
    76  	}
    77  }