Skip to content

Commit 8342f03

Browse files
committed
New: support for environment variables as data source
1 parent 633c8fa commit 8342f03

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,15 @@ go get github.com/marcelocarlos/datasubst
2626
datasubst --json-data examples/basic-data.json -i examples/basic-input.txt
2727
# Using YAML as data source
2828
datasubst --yaml-data examples/basic-data.yaml -i examples/basic-input.txt
29+
# Using environment variables as data source
30+
TEST1="hello" TEST2="world" datasubst --input examples/basic-input-env.txt --env-data
2931

3032
# Using stdin - JSON
3133
echo "v1: {{ .key1 }}" | datasubst --json-data examples/basic-data.json
3234
# Using stdin - YAML
3335
echo "v3: {{ .key2.first.key3 }}" | datasubst --yaml-data examples/basic-data.yaml
36+
# Using stdin - env vars
37+
echo "example: {{ .VAR3 }}" | VAR3="v3" datasubst --env-data
3438
```
3539

3640
See [examples](./examples/) for more.

examples/basic-input-env.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
test1: {{ .TEST1 }}
2+
test2: {{ .TEST2 }}

main.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,19 @@ import (
99
"os"
1010
"path/filepath"
1111
"runtime/debug"
12+
"strings"
1213
"text/template"
1314

1415
"gopkg.in/yaml.v3"
1516
)
1617

1718
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]
1920
2021
Options:
2122
-j, --json-data DATA_INPUT Input data source in JSON format.
2223
-y, --yaml-data DATA_INPUT Input data source in YAML format.
24+
-e, --env-data Input data source comes from environment variables.
2325
-i, --input INPUT Input template file in go template format.
2426
-o, --output OUTPUT Write the output to the file at OUTPUT.
2527
--help PATH Display this help and exit.
@@ -29,7 +31,8 @@ INPUT defaults to standard input and OUTPUT defaults to standard output.
2931
3032
Examples:
3133
$ 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`
3336

3437
var Version string
3538

@@ -61,6 +64,25 @@ func parseJSON(jsonDataFile string) (interface{}, error) {
6164
return data, nil
6265
}
6366

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+
6486
func main() {
6587
log.SetFlags(0)
6688
flag.Usage = func() { fmt.Fprintf(os.Stderr, "%s\n", usage) }
@@ -70,13 +92,15 @@ func main() {
7092

7193
var (
7294
inputFile, outputFile, jsonDataFile, yamlDataFile string
73-
helpFlag, versionFlag bool
95+
envFlag, helpFlag, versionFlag bool
7496
)
7597

7698
flag.StringVar(&inputFile, "input", "", "input template file in go template format")
7799
flag.StringVar(&inputFile, "i", "", "input template file in go template format")
78100
flag.StringVar(&jsonDataFile, "json-data", "", "input data source in JSON format")
79101
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")
80104
flag.StringVar(&outputFile, "output", "", "write the output to the file at OUTPUT")
81105
flag.StringVar(&outputFile, "o", "", "write the output to the file at OUTPUT")
82106
flag.StringVar(&yamlDataFile, "yaml-data", "", "input data source in YAML format")
@@ -103,8 +127,8 @@ func main() {
103127
return
104128
}
105129

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")
108132
}
109133
// Read input
110134
in := os.Stdin
@@ -124,8 +148,10 @@ func main() {
124148
var data interface{}
125149
if jsonDataFile != "" {
126150
data, err = parseJSON(jsonDataFile)
127-
} else {
151+
} else if yamlDataFile != "" {
128152
data, err = parseYAML(yamlDataFile)
153+
} else {
154+
data, err = parseEnv()
129155
}
130156
if err != nil {
131157
log.Fatalf("Error opening data file: %v\n", err)

0 commit comments

Comments
 (0)