14
14
package godotenv
15
15
16
16
import (
17
- "bufio"
18
17
"errors"
19
18
"fmt"
20
19
"io"
20
+ "io/ioutil"
21
21
"os"
22
22
"os/exec"
23
23
"regexp"
@@ -28,6 +28,16 @@ import (
28
28
29
29
const doubleQuoteSpecialChars = "\\ \n \r \" !$`"
30
30
31
+ // Parse reads an env file from io.Reader, returning a map of keys and values.
32
+ func Parse (r io.Reader ) (map [string ]string , error ) {
33
+ data , err := ioutil .ReadAll (r )
34
+ if err != nil {
35
+ return nil , err
36
+ }
37
+
38
+ return UnmarshalBytes (data )
39
+ }
40
+
31
41
// Load will read your env file(s) and load them into ENV for this process.
32
42
//
33
43
// Call this function as close as possible to the start of your program (ideally in main)
@@ -96,37 +106,16 @@ func Read(filenames ...string) (envMap map[string]string, err error) {
96
106
return
97
107
}
98
108
99
- // Parse reads an env file from io.Reader, returning a map of keys and values.
100
- func Parse (r io.Reader ) (envMap map [string ]string , err error ) {
101
- envMap = make (map [string ]string )
102
-
103
- var lines []string
104
- scanner := bufio .NewScanner (r )
105
- for scanner .Scan () {
106
- lines = append (lines , scanner .Text ())
107
- }
108
-
109
- if err = scanner .Err (); err != nil {
110
- return
111
- }
112
-
113
- for _ , fullLine := range lines {
114
- if ! isIgnoredLine (fullLine ) {
115
- var key , value string
116
- key , value , err = parseLine (fullLine , envMap )
117
-
118
- if err != nil {
119
- return
120
- }
121
- envMap [key ] = value
122
- }
123
- }
124
- return
109
+ // Unmarshal reads an env file from a string, returning a map of keys and values.
110
+ func Unmarshal (str string ) (envMap map [string ]string , err error ) {
111
+ return UnmarshalBytes ([]byte (str ))
125
112
}
126
113
127
- //Unmarshal reads an env file from a string, returning a map of keys and values.
128
- func Unmarshal (str string ) (envMap map [string ]string , err error ) {
129
- return Parse (strings .NewReader (str ))
114
+ // UnmarshalBytes parses env file from byte slice of chars, returning a map of keys and values.
115
+ func UnmarshalBytes (src []byte ) (map [string ]string , error ) {
116
+ out := make (map [string ]string )
117
+ err := parseBytes (src , out )
118
+ return out , err
130
119
}
131
120
132
121
// Exec loads env vars from the specified filenames (empty map falls back to default)
@@ -137,7 +126,9 @@ func Unmarshal(str string) (envMap map[string]string, err error) {
137
126
// If you want more fine grained control over your command it's recommended
138
127
// that you use `Load()` or `Read()` and the `os/exec` package yourself.
139
128
func Exec (filenames []string , cmd string , cmdArgs []string ) error {
140
- Load (filenames ... )
129
+ if err := Load (filenames ... ); err != nil {
130
+ return err
131
+ }
141
132
142
133
command := exec .Command (cmd , cmdArgs ... )
143
134
command .Stdin = os .Stdin
@@ -161,8 +152,7 @@ func Write(envMap map[string]string, filename string) error {
161
152
if err != nil {
162
153
return err
163
154
}
164
- file .Sync ()
165
- return err
155
+ return file .Sync ()
166
156
}
167
157
168
158
// Marshal outputs the given environment as a dotenv-formatted environment file.
@@ -202,7 +192,7 @@ func loadFile(filename string, overload bool) error {
202
192
203
193
for key , value := range envMap {
204
194
if ! currentEnv [key ] || overload {
205
- os .Setenv (key , value )
195
+ _ = os .Setenv (key , value )
206
196
}
207
197
}
208
198
@@ -343,11 +333,6 @@ func expandVariables(v string, m map[string]string) string {
343
333
})
344
334
}
345
335
346
- func isIgnoredLine (line string ) bool {
347
- trimmedLine := strings .TrimSpace (line )
348
- return len (trimmedLine ) == 0 || strings .HasPrefix (trimmedLine , "#" )
349
- }
350
-
351
336
func doubleQuoteEscape (line string ) string {
352
337
for _ , c := range doubleQuoteSpecialChars {
353
338
toReplace := "\\ " + string (c )
0 commit comments