@@ -9,17 +9,19 @@ import (
9
9
"os"
10
10
"path/filepath"
11
11
"runtime/debug"
12
+ "strings"
12
13
"text/template"
13
14
14
15
"gopkg.in/yaml.v3"
15
16
)
16
17
17
18
const usage = `Usage:
18
- datasubst (--json-data DATA_INPUT | --yaml-data DATA_INPUT) [-i INPUT] [-o OUTPUT]
19
+ datasubst (--json-data DATA_INPUT | --yaml-data DATA_INPUT | --env-data ) [-i INPUT] [-o OUTPUT]
19
20
20
21
Options:
21
22
-j, --json-data DATA_INPUT Input data source in JSON format.
22
23
-y, --yaml-data DATA_INPUT Input data source in YAML format.
24
+ -e, --env-data Input data source comes from environment variables.
23
25
-i, --input INPUT Input template file in go template format.
24
26
-o, --output OUTPUT Write the output to the file at OUTPUT.
25
27
--help PATH Display this help and exit.
@@ -29,7 +31,8 @@ INPUT defaults to standard input and OUTPUT defaults to standard output.
29
31
30
32
Examples:
31
33
$ datasubst --input examples/basic-input.txt --json-data examples/basic-data.json
32
- $ echo "v3: {{ .key2.first.key3 }}" | datasubst --yaml-data examples/basic-data.yaml`
34
+ $ echo "v3: {{ .key2.first.key3 }}" | datasubst --yaml-data examples/basic-data.yaml
35
+ $ TEST1="hello" TEST2="world" datasubst --input examples/basic-input-env.txt --env-data`
33
36
34
37
var Version string
35
38
@@ -61,6 +64,25 @@ func parseJSON(jsonDataFile string) (interface{}, error) {
61
64
return data , nil
62
65
}
63
66
67
+ func parseEnv () (interface {}, error ) {
68
+ data := make (map [string ]string )
69
+ for _ , v := range os .Environ () {
70
+ envKv := strings .Split (v , "=" )
71
+ data [envKv [0 ]] = envKv [1 ]
72
+ }
73
+ return data , nil
74
+ }
75
+
76
+ func countTrue (b ... bool ) int {
77
+ n := 0
78
+ for _ , v := range b {
79
+ if v {
80
+ n ++
81
+ }
82
+ }
83
+ return n
84
+ }
85
+
64
86
func main () {
65
87
log .SetFlags (0 )
66
88
flag .Usage = func () { fmt .Fprintf (os .Stderr , "%s\n " , usage ) }
@@ -70,13 +92,15 @@ func main() {
70
92
71
93
var (
72
94
inputFile , outputFile , jsonDataFile , yamlDataFile string
73
- helpFlag , versionFlag bool
95
+ envFlag , helpFlag , versionFlag bool
74
96
)
75
97
76
98
flag .StringVar (& inputFile , "input" , "" , "input template file in go template format" )
77
99
flag .StringVar (& inputFile , "i" , "" , "input template file in go template format" )
78
100
flag .StringVar (& jsonDataFile , "json-data" , "" , "input data source in JSON format" )
79
101
flag .StringVar (& jsonDataFile , "j" , "" , "input data source in JSON format" )
102
+ flag .BoolVar (& envFlag , "env-data" , false , "input data source comes from environment variables" )
103
+ flag .BoolVar (& envFlag , "e" , false , "input data source comes from environment variables" )
80
104
flag .StringVar (& outputFile , "output" , "" , "write the output to the file at OUTPUT" )
81
105
flag .StringVar (& outputFile , "o" , "" , "write the output to the file at OUTPUT" )
82
106
flag .StringVar (& yamlDataFile , "yaml-data" , "" , "input data source in YAML format" )
@@ -103,8 +127,8 @@ func main() {
103
127
return
104
128
}
105
129
106
- if (jsonDataFile == "" && yamlDataFile == "" ) || ( jsonDataFile != "" && yamlDataFile != "" ) {
107
- log .Fatal ("Error: please specify --json-data or --yaml -data" )
130
+ if countTrue (jsonDataFile != "" , yamlDataFile != "" , envFlag ) != 1 {
131
+ log .Fatal ("Error: please specify --json-data, --yaml-data or --env -data" )
108
132
}
109
133
// Read input
110
134
in := os .Stdin
@@ -124,8 +148,10 @@ func main() {
124
148
var data interface {}
125
149
if jsonDataFile != "" {
126
150
data , err = parseJSON (jsonDataFile )
127
- } else {
151
+ } else if yamlDataFile != "" {
128
152
data , err = parseYAML (yamlDataFile )
153
+ } else {
154
+ data , err = parseEnv ()
129
155
}
130
156
if err != nil {
131
157
log .Fatalf ("Error opening data file: %v\n " , err )
0 commit comments