File tree Expand file tree Collapse file tree 2 files changed +52
-0
lines changed
Expand file tree Collapse file tree 2 files changed +52
-0
lines changed Original file line number Diff line number Diff 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+ }
Original file line number Diff line number Diff 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 )
You can’t perform that action at this time.
0 commit comments