feat: support bool for env tag (#2593)

master
Kevin Wan 2 years ago committed by GitHub
parent 69068cdaf0
commit b562e940e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,6 +6,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"reflect" "reflect"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -342,6 +343,14 @@ func (u *Unmarshaler) processFieldWithEnvValue(field reflect.StructField, value
envVal string, opts *fieldOptionsWithContext, fullName string) error { envVal string, opts *fieldOptionsWithContext, fullName string) error {
fieldKind := field.Type.Kind() fieldKind := field.Type.Kind()
switch fieldKind { switch fieldKind {
case reflect.Bool:
val, err := strconv.ParseBool(envVal)
if err != nil {
return fmt.Errorf("unmarshal field %q with environment variable, %w", fullName, err)
}
value.SetBool(val)
return nil
case durationType.Kind(): case durationType.Kind():
if err := fillDurationValue(fieldKind, value, envVal); err != nil { if err := fillDurationValue(fieldKind, value, envVal); err != nil {
return fmt.Errorf("unmarshal field %q with environment variable, %w", fullName, err) return fmt.Errorf("unmarshal field %q with environment variable, %w", fullName, err)

@ -3186,6 +3186,47 @@ func TestUnmarshal_EnvFloatOverwrite(t *testing.T) {
assert.Equal(t, float32(123.45), v.Age) assert.Equal(t, float32(123.45), v.Age)
} }
func TestUnmarshal_EnvBoolTrue(t *testing.T) {
type Value struct {
Enable bool `key:"enable,env=TEST_NAME_BOOL_TRUE"`
}
const envName = "TEST_NAME_BOOL_TRUE"
os.Setenv(envName, "true")
defer os.Unsetenv(envName)
var v Value
assert.NoError(t, UnmarshalKey(emptyMap, &v))
assert.True(t, v.Enable)
}
func TestUnmarshal_EnvBoolFalse(t *testing.T) {
type Value struct {
Enable bool `key:"enable,env=TEST_NAME_BOOL_FALSE"`
}
const envName = "TEST_NAME_BOOL_FALSE"
os.Setenv(envName, "false")
defer os.Unsetenv(envName)
var v Value
assert.NoError(t, UnmarshalKey(emptyMap, &v))
assert.False(t, v.Enable)
}
func TestUnmarshal_EnvBoolBad(t *testing.T) {
type Value struct {
Enable bool `key:"enable,env=TEST_NAME_BOOL_BAD"`
}
const envName = "TEST_NAME_BOOL_BAD"
os.Setenv(envName, "bad")
defer os.Unsetenv(envName)
var v Value
assert.Error(t, UnmarshalKey(emptyMap, &v))
}
func TestUnmarshal_EnvDuration(t *testing.T) { func TestUnmarshal_EnvDuration(t *testing.T) {
type Value struct { type Value struct {
Duration time.Duration `key:"duration,env=TEST_NAME_DURATION"` Duration time.Duration `key:"duration,env=TEST_NAME_DURATION"`

Loading…
Cancel
Save