go1.25 bumped lib version added in dotenv assign func
This commit is contained in:
82
dotenv/assign.go
Normal file
82
dotenv/assign.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package dotenv
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log/slog"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Assign env tag matching values from envMap
|
||||
func Assign[T any](c *T, envMap map[string]string) error {
|
||||
if c == nil {
|
||||
return errors.New("nil arg")
|
||||
}
|
||||
|
||||
slog.Info("env map", "v", envMap)
|
||||
|
||||
val := reflect.Indirect(reflect.ValueOf(c))
|
||||
name := val.Type().Name()
|
||||
for i := range val.NumField() {
|
||||
f := val.Type().Field(i)
|
||||
tag := f.Tag.Get("env")
|
||||
if tag == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
var v string
|
||||
var ok bool
|
||||
if multiTag := strings.Split(tag, ","); len(multiTag) > 1 {
|
||||
// multi tags like env:"DB_URL,PG_DB_URL"
|
||||
for _, mt := range multiTag {
|
||||
if v, ok = envMap[strings.TrimSpace(mt)]; ok {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
v, ok = envMap[tag]
|
||||
}
|
||||
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
field := val.FieldByName(f.Name)
|
||||
if !field.IsValid() {
|
||||
continue
|
||||
}
|
||||
|
||||
switch f.Type.Kind() {
|
||||
case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
|
||||
if v, err := strconv.ParseInt(v, 10, 64); err != nil {
|
||||
return err
|
||||
} else {
|
||||
field.SetInt(v)
|
||||
}
|
||||
case reflect.Float32, reflect.Float64:
|
||||
if v, err := strconv.ParseFloat(v, 10); err != nil {
|
||||
return err
|
||||
} else {
|
||||
field.SetFloat(v)
|
||||
}
|
||||
case reflect.Bool:
|
||||
if strings.EqualFold(v, "true") {
|
||||
field.SetBool(true)
|
||||
} else {
|
||||
field.SetBool(false)
|
||||
}
|
||||
|
||||
default:
|
||||
field.SetString(v)
|
||||
}
|
||||
|
||||
if name == "" {
|
||||
slog.Info("override value from env", "field", f.Name)
|
||||
} else {
|
||||
slog.Info("override value from env", "type", name, "field", f.Name)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -23,7 +23,7 @@ const (
|
||||
)
|
||||
|
||||
func parseBytes(src []byte, out map[string]string) error {
|
||||
src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1)
|
||||
src = bytes.ReplaceAll(src, []byte("\r\n"), []byte("\n"))
|
||||
cutset := src
|
||||
for {
|
||||
cutset = getStatementStart(cutset)
|
||||
@@ -76,8 +76,8 @@ func getStatementStart(src []byte) []byte {
|
||||
func locateKeyName(src []byte) (key string, cutset []byte, err error) {
|
||||
// trim "export" and space at beginning
|
||||
src = bytes.TrimLeftFunc(src, isSpace)
|
||||
if bytes.HasPrefix(src, []byte(exportPrefix)) {
|
||||
trimmed := bytes.TrimPrefix(src, []byte(exportPrefix))
|
||||
if after, ok := bytes.CutPrefix(src, []byte(exportPrefix)); ok {
|
||||
trimmed := after
|
||||
if bytes.IndexFunc(trimmed, isSpace) == 0 {
|
||||
src = bytes.TrimLeftFunc(trimmed, isSpace)
|
||||
}
|
||||
|
||||
@@ -22,14 +22,17 @@ func Read(dir string, filenames ...string) (envMap map[string]string, err error)
|
||||
|
||||
for _, filename := range filenames {
|
||||
slog.Info("read .env", slog.String("file", filepath.Join(dir, filename)))
|
||||
individualEnvMap, individualErr := readFile(filepath.Join(dir, filename))
|
||||
|
||||
if individualErr != nil {
|
||||
err = individualErr
|
||||
m, er := readFile(filepath.Join(dir, filename))
|
||||
if er != nil {
|
||||
if os.IsNotExist(er) {
|
||||
slog.Info(".env not found", slog.String("file", filename))
|
||||
continue
|
||||
}
|
||||
err = er
|
||||
return
|
||||
}
|
||||
|
||||
maps.Copy(envMap, individualEnvMap)
|
||||
maps.Copy(envMap, m)
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
@@ -56,7 +56,7 @@ func doubleQuoteEscape(line string) string {
|
||||
if c == '\r' {
|
||||
toReplace = `\r`
|
||||
}
|
||||
line = strings.Replace(line, string(c), toReplace, -1)
|
||||
line = strings.ReplaceAll(line, string(c), toReplace)
|
||||
}
|
||||
return line
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user