package configtest import ( "bufio" "os" "strings" "github.com/nspcc-dev/neofs-node/cmd/neofs-node/config" ) func fromFile(path string) *config.Config { var p config.Prm os.Clearenv() // ENVs have priority over config files, so we do this in tests return config.New(p, config.WithConfigFile(path), ) } func fromEnvFile(path string) *config.Config { var p config.Prm loadEnv(path) // github.com/joho/godotenv can do that as well return config.New(p) } func forEachFile(paths []string, f func(*config.Config)) { for i := range paths { f(fromFile(paths[i])) } } // ForEachFileType passes configs read from next files: // - `<pref>.yaml`; // - `<pref>.json`. func ForEachFileType(pref string, f func(*config.Config)) { forEachFile([]string{ pref + ".yaml", pref + ".json", }, f) } // ForEnvFileType creates config from `<pref>.env` file. func ForEnvFileType(pref string, f func(*config.Config)) { f(fromEnvFile(pref + ".env")) } // EmptyConfig returns config without any values and sections. func EmptyConfig() *config.Config { var p config.Prm return config.New(p) } // loadEnv reads .env file, parses `X=Y` records and sets OS ENVs. func loadEnv(path string) { f, err := os.Open(path) if err != nil { panic("can't open .env file") } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { pair := strings.SplitN(scanner.Text(), "=", 2) if len(pair) != 2 { continue } pair[1] = strings.Trim(pair[1], `"`) err = os.Setenv(pair[0], pair[1]) if err != nil { panic("can't set environment variable") } } }