Skip to content

Commit 9fcb283

Browse files
authored
refactor: Use generic parser for float (#106)
1 parent e41878c commit 9fcb283

File tree

3 files changed

+37
-46
lines changed

3 files changed

+37
-46
lines changed

internal/iface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,15 +335,15 @@ func (i int64SliceParser) ParseEnv(key string, defaltVal any, options Parameters
335335
type float32Parser float32
336336

337337
func (f float32Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
338-
val := float32OrDefault(key, defaltVal.(float32))
338+
val := floatOrDefaultGen(key, defaltVal.(float32))
339339

340340
return val
341341
}
342342

343343
type float64Parser float64
344344

345345
func (f float64Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
346-
val := float64OrDefault(key, defaltVal.(float64))
346+
val := floatOrDefaultGen(key, defaltVal.(float64))
347347

348348
return val
349349
}

internal/parsers.go

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,39 @@ func int8SliceOrDefault(key string, defaultVal []int8, sep string) []int8 {
229229
return val
230230
}
231231

232+
func floatOrDefaultGen[T float32 | float64](key string, defaultVal T) T {
233+
env := stringOrDefault(key, "")
234+
if env == "" {
235+
return defaultVal
236+
}
237+
238+
const (
239+
bitsize = 64
240+
)
241+
242+
var (
243+
castFn func(val float64) T
244+
)
245+
246+
switch any(defaultVal).(type) {
247+
case float32:
248+
castFn = func(val float64) T {
249+
return any(float32(val)).(T)
250+
}
251+
case float64:
252+
castFn = func(val float64) T {
253+
return any(val).(T)
254+
}
255+
}
256+
257+
val, err := strconv.ParseFloat(env, bitsize)
258+
if err != nil {
259+
return defaultVal
260+
}
261+
262+
return castFn(val)
263+
}
264+
232265
func intOrDefaultGen[T int | int8 | int16 | int32 | int64](key string, defaultVal T) T {
233266
env := stringOrDefault(key, "")
234267
if env == "" {
@@ -416,48 +449,6 @@ func durationSliceOrDefault(key string, defaultVal []time.Duration, separator st
416449
return val
417450
}
418451

419-
// float32OrDefault retrieves the float32 value of the environment variable named
420-
// by the key.
421-
// If variable not set or value is empty - defaultVal will be returned.
422-
func float32OrDefault(key string, defaultVal float32) float32 {
423-
env := stringOrDefault(key, "")
424-
if env == "" {
425-
return defaultVal
426-
}
427-
428-
const (
429-
bitsize = 32
430-
)
431-
432-
val, err := strconv.ParseFloat(env, bitsize)
433-
if err != nil {
434-
return defaultVal
435-
}
436-
437-
return float32(val)
438-
}
439-
440-
// float64OrDefault retrieves the float64 value of the environment variable named
441-
// by the key.
442-
// If variable not set or value is empty - defaultVal will be returned.
443-
func float64OrDefault(key string, defaultVal float64) float64 {
444-
env := stringOrDefault(key, "")
445-
if env == "" {
446-
return defaultVal
447-
}
448-
449-
const (
450-
bitsize = 64
451-
)
452-
453-
val, err := strconv.ParseFloat(env, bitsize)
454-
if err != nil {
455-
return defaultVal
456-
}
457-
458-
return val
459-
}
460-
461452
// uint64OrDefault retrieves the unt64 value of the environment variable named
462453
// by the key.
463454
// If variable not set or value is empty - defaultVal will be returned.

internal/parsers_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ func Test_float32OrDefault(t *testing.T) {
537537
t.Run(tt.name, func(t *testing.T) {
538538
tt.precond.maybeSetEnv(t, tt.args.key)
539539

540-
got := float32OrDefault(tt.args.key, tt.args.defaultVal)
540+
got := floatOrDefaultGen(tt.args.key, tt.args.defaultVal)
541541
assert.Equal(t, tt.expected.val, got)
542542
})
543543
}
@@ -613,7 +613,7 @@ func Test_float64OrDefault(t *testing.T) {
613613
t.Run(tt.name, func(t *testing.T) {
614614
tt.precond.maybeSetEnv(t, tt.args.key)
615615

616-
got := float64OrDefault(tt.args.key, tt.args.defaultVal)
616+
got := floatOrDefaultGen(tt.args.key, tt.args.defaultVal)
617617
assert.Equal(t, tt.expected.val, got)
618618
})
619619
}

0 commit comments

Comments
 (0)