wand/env.go
2025-09-11 21:16:39 +02:00

88 lines
1.4 KiB
Go

package wand
import (
"github.com/iancoleman/strcase"
"strings"
)
type env struct {
values map[string][]string
originalNames map[string]string
}
func splitEnvValue(v string) []string {
var (
values []string
escape bool
current []rune
)
for _, r := range []rune(v) {
if escape {
current = append(current, r)
escape = false
continue
}
if r == '\\' {
escape = true
continue
}
if r == ':' {
values = append(values, string(current))
current = nil
continue
}
current = append(current, r)
}
values = append(values, string(current))
return values
}
func readEnv(appName string, input []string) env {
appName = strcase.ToKebab(appName)
e := env{
values: make(map[string][]string),
originalNames: make(map[string]string),
}
for _, i := range input {
parts := strings.SplitN(i, "=", 2)
if len(parts) != 2 {
continue
}
key, value := parts[0], parts[1]
key = strcase.ToKebab(key)
if len(key) <= len(appName)+1 || !strings.HasPrefix(key, appName+"-") {
continue
}
key = key[len(appName)+1:]
e.originalNames[key] = parts[0]
e.values[key] = splitEnvValue(value)
}
return e
}
func getenv(env []string, name string) string {
for _, ei := range env {
eip := strings.Split(ei, "=")
if len(eip) < 2 {
continue
}
if eip[0] != name {
continue
}
return strings.Join(eip[1:], "=")
}
return ""
}