fs.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //go:build go1.16 && finder
  2. // +build go1.16,finder
  3. package viper
  4. import (
  5. "errors"
  6. "io/fs"
  7. "path"
  8. )
  9. type finder struct {
  10. paths []string
  11. fileNames []string
  12. extensions []string
  13. withoutExtension bool
  14. }
  15. func (f finder) Find(fsys fs.FS) (string, error) {
  16. for _, searchPath := range f.paths {
  17. for _, fileName := range f.fileNames {
  18. for _, extension := range f.extensions {
  19. filePath := path.Join(searchPath, fileName+"."+extension)
  20. ok, err := fileExists(fsys, filePath)
  21. if err != nil {
  22. return "", err
  23. }
  24. if ok {
  25. return filePath, nil
  26. }
  27. }
  28. if f.withoutExtension {
  29. filePath := path.Join(searchPath, fileName)
  30. ok, err := fileExists(fsys, filePath)
  31. if err != nil {
  32. return "", err
  33. }
  34. if ok {
  35. return filePath, nil
  36. }
  37. }
  38. }
  39. }
  40. return "", nil
  41. }
  42. func fileExists(fsys fs.FS, filePath string) (bool, error) {
  43. fileInfo, err := fs.Stat(fsys, filePath)
  44. if err == nil {
  45. return !fileInfo.IsDir(), nil
  46. }
  47. if errors.Is(err, fs.ErrNotExist) {
  48. return false, nil
  49. }
  50. return false, err
  51. }