github.com/ShaleApps/viper@v1.15.1-concurrent/viper_go1_15.go (about)

     1  //go:build !go1.16 || !finder
     2  // +build !go1.16 !finder
     3  
     4  package viper
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"github.com/spf13/afero"
    12  )
    13  
    14  // Search all configPaths for any config file.
    15  // Returns the first path that exists (and is a config file).
    16  func (v *Viper) findConfigFile() (string, error) {
    17  	v.logger.Info("searching for config in paths", "paths", v.configPaths)
    18  
    19  	for _, cp := range v.configPaths {
    20  		file := v.searchInPath(cp)
    21  		if file != "" {
    22  			return file, nil
    23  		}
    24  	}
    25  	return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)}
    26  }
    27  
    28  func (v *Viper) searchInPath(in string) (filename string) {
    29  	v.logger.Debug("searching for config in path", "path", in)
    30  	for _, ext := range SupportedExts {
    31  		v.logger.Debug("checking if file exists", "file", filepath.Join(in, v.configName+"."+ext))
    32  		if b, _ := exists(v.fs, filepath.Join(in, v.configName+"."+ext)); b {
    33  			v.logger.Debug("found file", "file", filepath.Join(in, v.configName+"."+ext))
    34  			return filepath.Join(in, v.configName+"."+ext)
    35  		}
    36  	}
    37  
    38  	if v.configType != "" {
    39  		if b, _ := exists(v.fs, filepath.Join(in, v.configName)); b {
    40  			return filepath.Join(in, v.configName)
    41  		}
    42  	}
    43  
    44  	return ""
    45  }
    46  
    47  // Check if file Exists
    48  func exists(fs afero.Fs, path string) (bool, error) {
    49  	stat, err := fs.Stat(path)
    50  	if err == nil {
    51  		return !stat.IsDir(), nil
    52  	}
    53  	if os.IsNotExist(err) {
    54  		return false, nil
    55  	}
    56  	return false, err
    57  }