Skip to content

Commit 0e395f3

Browse files
committed
feat(config): add generic config Get support
Signed-off-by: agermel <agermel@foxmail.com>
1 parent fb8e43e commit 0e395f3

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

config/config.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,34 @@ func (c *config) Close() error {
156156
}
157157
return nil
158158
}
159+
160+
// Get retrieves a config value by key and scans it into the target type.
161+
func Get[T any](c Config, key string) (T, error) {
162+
var t T
163+
v := c.Value(key)
164+
165+
if v.Load() == nil {
166+
return t, ErrNotFound
167+
}
168+
169+
switch any(t).(type) {
170+
case bool:
171+
b, err := v.Bool()
172+
return any(b).(T), err
173+
case int64:
174+
i, err := v.Int()
175+
return any(i).(T), err
176+
case int:
177+
i, err := v.Int()
178+
return any(int(i)).(T), err
179+
case float64:
180+
f, err := v.Float()
181+
return any(f).(T), err
182+
case string:
183+
s, err := v.String()
184+
return any(s).(T), err
185+
}
186+
187+
err := v.Scan(&t)
188+
return t, err
189+
}

config/config_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,27 @@ func TestConfig(t *testing.T) {
154154
t.Fatal("databaseDriver is not equal to val")
155155
}
156156

157+
driverGet, err := Get[string](cf, "data.database.driver")
158+
if err != nil {
159+
t.Fatal(err)
160+
}
161+
if databaseDriver != driverGet {
162+
t.Errorf("Get[string] want: %s, got: %s", databaseDriver, driverGet)
163+
}
164+
165+
type HTTPConfig struct {
166+
Addr string `json:"addr"`
167+
Port int `json:"port"`
168+
}
169+
v, err := Get[HTTPConfig](cf, "server.http")
170+
if err != nil {
171+
t.Fatal(err)
172+
} else if v.Addr != httpAddr {
173+
t.Errorf("Get[HttpConfig] Addr want: %s, got: %s", httpAddr, v.Addr)
174+
} else if v.Port != 80 {
175+
t.Errorf("Get[HttpConfig] Port want: 80, got: %d", v.Port)
176+
}
177+
157178
err = cf.Watch("endpoints", func(string, Value) {})
158179
if err != nil {
159180
t.Fatal(err)

0 commit comments

Comments
 (0)