Skip to content

Commit 3ba6980

Browse files
authored
fix: config.Duration support int for yaml (#149)
* fix: config.Duration support int for yaml * fix: func prepareJsonTestSubject should be prepareJSONTestSubject
1 parent e6c6f98 commit 3ba6980

File tree

3 files changed

+53
-14
lines changed

3 files changed

+53
-14
lines changed

config/config.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,13 @@ func stringToConfigDurationHookFunc() mapstructure.DecodeHookFunc {
266266
return data, nil
267267
}
268268
var val string
269-
if f.Kind() == reflect.Float64 {
269+
switch f.Kind() {
270+
case reflect.Float64, reflect.Int:
270271
val = fmt.Sprintf("%v", data)
271-
} else if f.Kind() == reflect.String {
272+
case reflect.String:
272273
val = fmt.Sprintf(`"%v"`, data)
273-
} else {
274-
return nil, fmt.Errorf("expected a %s, should be float64 or string, got '%s'", t.String(), f.String())
274+
default:
275+
return nil, fmt.Errorf("expected a %s, should be float64/int/string, got '%s'", t.String(), f.String())
275276
}
276277
d := Duration{}
277278
err := d.UnmarshalJSON([]byte(val))

config/config_test.go

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818

1919
func TestKoanfAdapter_Route(t *gotesting.T) {
2020
t.Parallel()
21-
ka := prepareTestSubject(t)
21+
ka := prepareJSONTestSubject(t)
2222
assert.Implements(t, MapAdapter{}, ka.Route("foo"))
2323
assert.Implements(t, MapAdapter{}, ka.Route("foo"))
2424
}
@@ -30,7 +30,7 @@ func TestKoanfAdapter_race(t *gotesting.T) {
3030
}
3131
}()
3232
t.Parallel()
33-
ka := prepareTestSubject(t)
33+
ka := prepareJSONTestSubject(t)
3434
for i := 0; i < 100; i++ {
3535
go ka.Reload()
3636
ka.String("string")
@@ -81,37 +81,55 @@ func TestKoanfAdapter_Watch(t *gotesting.T) {
8181

8282
func TestKoanfAdapter_Bool(t *gotesting.T) {
8383
t.Parallel()
84-
k := prepareTestSubject(t)
84+
k := prepareJSONTestSubject(t)
8585
assert.True(t, k.Bool("bool"))
8686
}
8787

8888
func TestKoanfAdapter_String(t *gotesting.T) {
8989
t.Parallel()
90-
k := prepareTestSubject(t)
90+
k := prepareJSONTestSubject(t)
9191
assert.Equal(t, "string", k.String("string"))
9292
}
9393

9494
func TestKoanfAdapter_Strings(t *gotesting.T) {
9595
t.Parallel()
96-
k := prepareTestSubject(t)
96+
k := prepareJSONTestSubject(t)
9797
assert.Equal(t, []string{"foo", "bar"}, k.Strings("strings"))
9898
}
9999

100100
func TestKoanfAdapter_Float64(t *gotesting.T) {
101101
t.Parallel()
102-
k := prepareTestSubject(t)
102+
k := prepareJSONTestSubject(t)
103103
assert.Equal(t, 1.0, k.Float64("float"))
104104
}
105105

106106
func TestKoanfAdapter_Get(t *gotesting.T) {
107107
t.Parallel()
108-
k := prepareTestSubject(t)
108+
k := prepareJSONTestSubject(t)
109109
assert.Equal(t, 1.0, k.Get("float"))
110110
}
111111

112-
func TestKoanfAdapter_Unmarshal(t *gotesting.T) {
112+
func TestKoanfAdapter_Unmarshal_Json(t *gotesting.T) {
113113
t.Parallel()
114-
ka := prepareTestSubject(t)
114+
ka := prepareJSONTestSubject(t)
115+
var target string
116+
err := ka.Unmarshal("foo.bar", &target)
117+
assert.NoError(t, err)
118+
assert.Equal(t, "baz", target)
119+
120+
var r Duration
121+
err = ka.Unmarshal("duration_string", &r)
122+
assert.NoError(t, err)
123+
assert.Equal(t, r, Duration{1 * time.Second})
124+
125+
err = ka.Unmarshal("duration_number", &r)
126+
assert.NoError(t, err)
127+
assert.Equal(t, r, Duration{1 * time.Nanosecond})
128+
}
129+
130+
func TestKoanfAdapter_Unmarshal_Yaml(t *gotesting.T) {
131+
t.Parallel()
132+
ka := prepareYamlTestSubject(t)
115133
var target string
116134
err := ka.Unmarshal("foo.bar", &target)
117135
assert.NoError(t, err)
@@ -201,11 +219,20 @@ func TestMapAdapter_Unmarshal(t *gotesting.T) {
201219
}, target)
202220
}
203221

204-
func prepareTestSubject(t *gotesting.T) *KoanfAdapter {
222+
func prepareJSONTestSubject(t *gotesting.T) *KoanfAdapter {
205223
k := koanf.New(".")
206224
if err := k.Load(file.Provider("testdata/mock.json"), json.Parser()); err != nil {
207225
t.Fatalf("error loading config: %v", err)
208226
}
209227
ka := KoanfAdapter{K: k}
210228
return &ka
211229
}
230+
231+
func prepareYamlTestSubject(t *gotesting.T) *KoanfAdapter {
232+
k := koanf.New(".")
233+
if err := k.Load(file.Provider("testdata/mock.yaml"), yaml.Parser()); err != nil {
234+
t.Fatalf("error loading config: %v", err)
235+
}
236+
ka := KoanfAdapter{K: k}
237+
return &ka
238+
}

config/testdata/mock.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
foo:
2+
bar: baz
3+
bool: true
4+
string: string
5+
int: 42
6+
strings:
7+
- foo
8+
- bar
9+
float: 1
10+
duration_string: 1s
11+
duration_number: 1

0 commit comments

Comments
 (0)