-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenvparser.go
59 lines (46 loc) · 1.61 KB
/
envparser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main
import (
"os"
"strings"
)
func parseEnvironmentVariable(envAsStr string) (name string, value string) {
split := strings.SplitN(envAsStr, "=", 2)
return split[0], split[1]
}
// parseVariableAppending appends text to existing environment variable
// Example input: PATH+BIN=/opt/bin
// Example output: PATH=/bin:/sbin:/usr/bin:/opt/bin
func parseVariableAppending(envAsStr string) string {
name, valueToAppend := parseEnvironmentVariable(envAsStr)
// make sure
if !strings.Contains(name, "+") {
return envAsStr
}
split := strings.SplitN(name, "+", 2)
realEnvName := split[0]
newValue := os.Getenv(realEnvName) + ":" + valueToAppend
return realEnvName + "=" + newValue
}
// ParseEnvironmentVariables returns list of environment variables
// Example input: env:TEST=1 env:BAKUNIN=Mikhail book-reader --from-env
// Example output: {TEST=1, BAKUNIN=Mikhail}
func parseEnvironmentVariables(inputArgs []string) (out []string, remainingArgs []string) {
for _, arg := range inputArgs {
if len(arg) < 7 || arg[0:4] != "env:" || !strings.Contains(arg, "=") {
remainingArgs = append(remainingArgs, arg)
continue
}
envAsStr := arg[4:]
// support for appending value to variables e.g. PATH+BIN=/opt/bin
if strings.Contains(envAsStr, "+") {
envAsStr = parseVariableAppending(envAsStr)
}
// side effect: inform OS about the change
// this allows us to multiple append to same environment variable
// be aware of that in unit tests!
realEnvName, newValue := parseEnvironmentVariable(envAsStr)
_ = os.Setenv(realEnvName, newValue)
out = append(out, envAsStr)
}
return out, remainingArgs
}