-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoenv.go
130 lines (101 loc) · 2.25 KB
/
goenv.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package goenv
import (
"bufio"
"errors"
"os"
"regexp"
"strings"
"github.com/deeper-x/goenv/settings"
)
// EnvFile object representing .env file
type EnvFile struct {
content map[string]string
}
// New EnvFile builder, given an input file
func New(fpath ...string) (EnvFile, error) {
res := EnvFile{}
dotEnvFile := settings.DefaultFile
// check for paramters: 0 or 1 are accepted
// 0 param makes default value to be set
// 1 param makes it to value
if len(fpath) > 1 {
return res, errors.New("<= 1 parameter is required")
}
if len(fpath) == 1 {
dotEnvFile = fpath[0]
}
// 1. create Env File Content
efc, err := FileDump(dotEnvFile)
if err != nil {
return res, err
}
// 2. build a k:v map object
kv, err := buildKV(efc)
if err != nil {
return res, err
}
// 3. build EnvFile object
res.content = kv
return res, nil
}
// Get returns a string value, for an input key
func (ef *EnvFile) Get(k string) (string, error) {
v := ef.content[k]
if v == "" {
return "", errors.New("required key not present")
}
return v, nil
}
// FileDump read .env content
func FileDump(fpath ...string) ([]string, error) {
dotEnvFile := settings.DefaultFile
res := []string{}
// check for paramters: 0 or 1 are accepted
// 0 param makes default value to be set
// 1 param makes it to value
if len(fpath) > 1 {
return res, errors.New("<= 1 parameter is required")
}
if len(fpath) == 1 {
dotEnvFile = fpath[0]
}
fcontent, err := os.Open(dotEnvFile)
if err != nil {
return res, err
}
fscanner := bufio.NewScanner(fcontent)
fscanner.Split(bufio.ScanLines)
for fscanner.Scan() {
res = append(res, fscanner.Text())
}
return res, nil
}
func checkRowFormat(record string) (bool, error) {
res := false
rxp, err := regexp.Compile(settings.RegexRow)
if err != nil {
return res, err
}
if !rxp.MatchString(record) {
return res, nil
}
res = true
return res, nil
}
// buildKV returns a k:v map with all environment vars
func buildKV(values []string) (map[string]string, error) {
res := map[string]string{}
for i := range values {
ok, err := checkRowFormat(values[i])
if err != nil {
return res, err
}
if ok {
cursl := strings.Split(values[i], "=")
k := cursl[0]
v := cursl[1]
res[k] = v
}
}
return res, nil
}