From 4a84dcdabe8b2ec367e04ddb0b2d90d9c92ae6d2 Mon Sep 17 00:00:00 2001 From: Roy Olav Purser Date: Sat, 17 Sep 2022 13:07:12 +0200 Subject: [PATCH] use local files for test --- envconf.go | 160 +++++++++++++++++++++++++++++-------------------- tests/build.sh | 7 +++ 2 files changed, 102 insertions(+), 65 deletions(-) diff --git a/envconf.go b/envconf.go index 00127b5..659c7c6 100644 --- a/envconf.go +++ b/envconf.go @@ -20,35 +20,47 @@ type cEntry struct { hasdef bool // Default value is defined } +type keyLookupStruct struct { + key string + end bool + next map[string]*keyLookupStruct +} + +func (kl *keyLookupStruct) setKey(parts []string, key string) { + if len(kl.next) == 0 { + kl.next = make(map[string]*keyLookupStruct) + } + if len(parts) > 0 { + nextLookup := new(keyLookupStruct) + nextLookup.setKey(parts[1:], key) + kl.next[parts[0]] = nextLookup + } else { + kl.key = key + kl.end = true + } +} + type Config struct { - parsed bool - env map[string]cEntry - mapEnv map[string]map[string]string - mapMapEnv map[string]map[string]map[string]string - mapMapMapEnv map[string]map[string]map[string]map[string]string - mapMapMapMapEnv map[string]map[string]map[string]map[string]map[string]string - mapMapMapMapMapEnv map[string]map[string]map[string]map[string]map[string]map[string]string + parsed bool + env map[string]cEntry + mapEnv map[int]*keyLookupStruct } // NewConfig returns an envconf.Config that is used to read configuration from environment variables. // The environment variables are stored in envconf.Config, so changes to the environment after NewConfig has been called // will not be taken into account. -func NewConfig() *Config { +func NewConfig(levels int) *Config { config := new(Config) config.parsed = false config.env = make(map[string]cEntry) - config.mapEnv = make(map[string]map[string]string) - config.mapMapEnv = make(map[string]map[string]map[string]string) - config.mapMapMapEnv = make(map[string]map[string]map[string]map[string]string) - config.mapMapMapMapEnv = make(map[string]map[string]map[string]map[string]map[string]string) - config.mapMapMapMapMapEnv = make(map[string]map[string]map[string]map[string]map[string]map[string]string) + config.mapEnv = make(map[int]*keyLookupStruct) for _, v := range os.Environ() { splitted := strings.SplitN(v, "=", 2) if len(splitted) == 2 { key := cleanKey(splitted[0]) val := splitted[1] - splitted = append(strings.Split(key, "_"), "", "", "", "", "", "") + splitted = append(strings.Split(key, "_"), make([]string, levels, levels)...) if unicode.IsLetter(getFirstRune(key)) { var entry cEntry entry.value = val @@ -58,65 +70,83 @@ func NewConfig() *Config { config.env[key] = entry if len(splitted) > 1 { for count, _ := range splitted { - if count < len(splitted)-6 { - var p0, p1, p2, p3, p4, p5 string - p0 = strings.Trim(strings.Join(splitted[:count], "_"), "_") - p1 = strings.Trim(strings.Join(splitted[count:], "_"), "_") - if len(config.mapEnv[p0]) == 0 { - config.mapEnv[p0] = make(map[string]string) - config.mapMapEnv[p0] = make(map[string]map[string]string) - config.mapMapMapEnv[p0] = make(map[string]map[string]map[string]string) - config.mapMapMapMapEnv[p0] = make(map[string]map[string]map[string]map[string]string) - config.mapMapMapMapMapEnv[p0] = make(map[string]map[string]map[string]map[string]map[string]string) - } - if p0 != "" && p1 != "" { - config.mapEnv[p0][p1] = key + if count >= len(splitted)-levels { + break + } + for level := 1; level <= levels; level++ { + parts := make([]string, level, level) + for partPos, part := range parts { + firstPartPos := 0 + if partPos > 0 { + firstPartPos = count + partPos - 1 + } + lastPartPos := firstPartPos + if partPos-1 == len(parts) { + lastPartPos = len(parts) + } + parts[partPos] = strings.Trim(strings.Join(splitted[:count], "_"), "_") } + config.mapEnv[level].setKey(parts, key) + } - p1 = splitted[count] - p2 = strings.Trim(strings.Join(splitted[count+1:], "_"), "_") - if len(config.mapMapEnv[p0][p1]) == 0 { - config.mapMapEnv[p0][p1] = make(map[string]string) - config.mapMapMapEnv[p0][p1] = make(map[string]map[string]string) - config.mapMapMapMapEnv[p0][p1] = make(map[string]map[string]map[string]string) - config.mapMapMapMapMapEnv[p0][p1] = make(map[string]map[string]map[string]map[string]string) - } - if p0 != "" && p1 != "" && p2 != "" { - config.mapMapEnv[p0][p1][p2] = key - } + var p0, p1, p2, p3, p4, p5 string + p0 = strings.Trim(strings.Join(splitted[:count], "_"), "_") + p1 = strings.Trim(strings.Join(splitted[count:], "_"), "_") + if len(config.mapEnv[p0]) == 0 { + config.mapEnv[p0] = make(map[string]string) + config.mapMapEnv[p0] = make(map[string]map[string]string) + config.mapMapMapEnv[p0] = make(map[string]map[string]map[string]string) + config.mapMapMapMapEnv[p0] = make(map[string]map[string]map[string]map[string]string) + config.mapMapMapMapMapEnv[p0] = make(map[string]map[string]map[string]map[string]map[string]string) + } + if p0 != "" && p1 != "" { + config.mapEnv[p0][p1] = key + } - p2 = splitted[count+1] - p3 = strings.Trim(strings.Join(splitted[count+2:], "_"), "_") - if len(config.mapMapMapEnv[p0][p1][p2]) == 0 { - config.mapMapMapEnv[p0][p1][p2] = make(map[string]string) - config.mapMapMapMapEnv[p0][p1][p2] = make(map[string]map[string]string) - config.mapMapMapMapMapEnv[p0][p1][p2] = make(map[string]map[string]map[string]string) - } - if p0 != "" && p1 != "" && p2 != "" && p3 != "" { - config.mapMapMapEnv[p0][p1][p2][p3] = key - } + p1 = splitted[count] + p2 = strings.Trim(strings.Join(splitted[count+1:], "_"), "_") + if len(config.mapMapEnv[p0][p1]) == 0 { + config.mapMapEnv[p0][p1] = make(map[string]string) + config.mapMapMapEnv[p0][p1] = make(map[string]map[string]string) + config.mapMapMapMapEnv[p0][p1] = make(map[string]map[string]map[string]string) + config.mapMapMapMapMapEnv[p0][p1] = make(map[string]map[string]map[string]map[string]string) + } + if p0 != "" && p1 != "" && p2 != "" { + config.mapMapEnv[p0][p1][p2] = key + } - p3 = splitted[count+2] - p4 = strings.Trim(strings.Join(splitted[count+3:], "_"), "_") - if len(config.mapMapMapMapEnv[p0][p1][p2][p3]) == 0 { - config.mapMapMapMapEnv[p0][p1][p2][p3] = make(map[string]string) - config.mapMapMapMapMapEnv[p0][p1][p2][p3] = make(map[string]map[string]string) - } - if p0 != "" && p1 != "" && p2 != "" && p3 != "" && p4 != "" { - config.mapMapMapMapEnv[p0][p1][p2][p3][p4] = key - } + p2 = splitted[count+1] + p3 = strings.Trim(strings.Join(splitted[count+2:], "_"), "_") + if len(config.mapMapMapEnv[p0][p1][p2]) == 0 { + config.mapMapMapEnv[p0][p1][p2] = make(map[string]string) + config.mapMapMapMapEnv[p0][p1][p2] = make(map[string]map[string]string) + config.mapMapMapMapMapEnv[p0][p1][p2] = make(map[string]map[string]map[string]string) + } + if p0 != "" && p1 != "" && p2 != "" && p3 != "" { + config.mapMapMapEnv[p0][p1][p2][p3] = key + } - p4 = splitted[count+3] - p5 = strings.Trim(strings.Join(splitted[count+4:], "_"), "_") - if len(config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4]) == 0 { - config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4] = make(map[string]string) - } - if p0 != "" && p1 != "" && p2 != "" && p3 != "" && p4 != "" && p5 != "" { - config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4][p5] = key - } + p3 = splitted[count+2] + p4 = strings.Trim(strings.Join(splitted[count+3:], "_"), "_") + if len(config.mapMapMapMapEnv[p0][p1][p2][p3]) == 0 { + config.mapMapMapMapEnv[p0][p1][p2][p3] = make(map[string]string) + config.mapMapMapMapMapEnv[p0][p1][p2][p3] = make(map[string]map[string]string) + } + if p0 != "" && p1 != "" && p2 != "" && p3 != "" && p4 != "" { + config.mapMapMapMapEnv[p0][p1][p2][p3][p4] = key + } + + p4 = splitted[count+3] + p5 = strings.Trim(strings.Join(splitted[count+4:], "_"), "_") + if len(config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4]) == 0 { + config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4] = make(map[string]string) + } + if p0 != "" && p1 != "" && p2 != "" && p3 != "" && p4 != "" && p5 != "" { + config.mapMapMapMapMapEnv[p0][p1][p2][p3][p4][p5] = key } } } + } } } diff --git a/tests/build.sh b/tests/build.sh index a6992ed..9159d28 100755 --- a/tests/build.sh +++ b/tests/build.sh @@ -19,4 +19,11 @@ cd ${dir}/buildenv go mod init src go mod tidy +package_name=$(ls ${dir}/buildenv/deps/pkg/mod/git.purser.it/roypur | tr -d "\n") +package_dir="${dir}/buildenv/deps/pkg/mod/git.purser.it/roypur/${package_name}" +chmod -R 777 ${package_dir} + +rm ${package_dir}/*.go +cp $(dirname ${dir})/*.go ${package_dir} + go build -o "${dir}/bin/test" "src/main.go"