maddy/framework/cfgparser/env.go

49 lines
1.1 KiB
Go

package parser
import (
"os"
"regexp"
"strings"
)
func expandEnvironment(nodes []Node) []Node {
// If nodes is nil - don't replace with empty slice, as nil indicates "no
// block".
if nodes == nil {
return nil
}
replacer := buildEnvReplacer()
newNodes := make([]Node, 0, len(nodes))
for _, node := range nodes {
node.Name = removeUnexpandedEnvvars(replacer.Replace(node.Name))
newArgs := make([]string, 0, len(node.Args))
for _, arg := range node.Args {
newArgs = append(newArgs, removeUnexpandedEnvvars(replacer.Replace(arg)))
}
node.Args = newArgs
node.Children = expandEnvironment(node.Children)
newNodes = append(newNodes, node)
}
return newNodes
}
var unixEnvvarRe = regexp.MustCompile(`{env:([^\$]+)}`)
func removeUnexpandedEnvvars(s string) string {
s = unixEnvvarRe.ReplaceAllString(s, "")
return s
}
func buildEnvReplacer() *strings.Replacer {
env := os.Environ()
pairs := make([]string, 0, len(env)*4)
for _, entry := range env {
parts := strings.SplitN(entry, "=", 2)
key := parts[0]
value := parts[1]
pairs = append(pairs, "{env:"+key+"}", value)
}
return strings.NewReplacer(pairs...)
}