/
env_variables.go
95 lines (76 loc) · 1.87 KB
/
env_variables.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package component
import (
"errors"
"fmt"
"github.com/rycus86/podlike/pkg/convert"
"io/ioutil"
"strings"
)
func variablesFromEnvFiles(files interface{}) (map[string]string, error) {
variables := map[string]string{}
if files == nil {
return variables, nil
}
if path, ok := files.(string); ok {
if fromFile, err := fromEnvFile(path); err != nil {
return nil, err
} else {
for key, value := range fromFile {
variables[key] = value
}
}
}
if list, ok := files.([]interface{}); ok {
for _, file := range list {
if path, ok := file.(string); ok {
if fromFile, err := fromEnvFile(path); err != nil {
return nil, err
} else {
for key, value := range fromFile {
variables[key] = value
}
}
} else {
return nil, errors.New(fmt.Sprintf("wrong env file path: %+v (%T)", file, file))
}
}
return variables, nil
}
return nil, errors.New(fmt.Sprintf("unexpected env file(s): %+v (%T)", files, files))
}
func fromEnvFile(path string) (map[string]string, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
variables := map[string]string{}
for _, line := range strings.Split(string(data), "\n") {
if line == "" {
continue
}
if strings.HasPrefix(line, "#") {
continue
}
parts := strings.SplitN(line, "=", 2)
if len(parts) == 2 {
variables[parts[0]] = parts[1]
} else {
// TODO is this an error with Compose?
}
}
return variables, nil
}
func mergeEnvVariables(fromFiles, fromVariables map[string]string) []string {
merged := map[interface{}]interface{}{}
for key, value := range fromFiles {
merged[key] = value
}
for key, value := range fromVariables {
merged[key] = value
}
asSlice, err := convert.ToStringSlice(merged)
if err != nil {
panic(fmt.Sprintf("failed to convert to a slice : %s\n%+v", err.Error(), merged)) // shouldn't happen
}
return asSlice
}