Skip to content

Commit e41878c

Browse files
authored
refactor: Use generic parser for integers (#105)
* refactor: Implement generic parser for integers * chore: Remove redundant default
1 parent 6fc973c commit e41878c

File tree

3 files changed

+61
-98
lines changed

3 files changed

+61
-98
lines changed

internal/iface.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func (s stringSliceParser) ParseEnv(key string, defaltVal any, options Parameter
225225
type intParser int
226226

227227
func (i intParser) ParseEnv(key string, defaltVal any, _ Parameters) any {
228-
val := intOrDefault(key, defaltVal.(int))
228+
val := intOrDefaultGen(key, defaltVal.(int))
229229

230230
return val
231231
}
@@ -263,31 +263,31 @@ func (i float64SliceParser) ParseEnv(key string, defaltVal any, options Paramete
263263
type int64Parser int64
264264

265265
func (i int64Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
266-
val := int64OrDefault(key, defaltVal.(int64))
266+
val := intOrDefaultGen(key, defaltVal.(int64))
267267

268268
return val
269269
}
270270

271271
type int8Parser int8
272272

273273
func (i int8Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
274-
val := int8OrDefault(key, defaltVal.(int8))
274+
val := intOrDefaultGen(key, defaltVal.(int8))
275275

276276
return val
277277
}
278278

279279
type int16Parser int16
280280

281281
func (i int16Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
282-
val := int16OrDefault(key, defaltVal.(int16))
282+
val := intOrDefaultGen(key, defaltVal.(int16))
283283

284284
return val
285285
}
286286

287287
type int32Parser int32
288288

289289
func (i int32Parser) ParseEnv(key string, defaltVal any, _ Parameters) any {
290-
val := int32OrDefault(key, defaltVal.(int32))
290+
val := intOrDefaultGen(key, defaltVal.(int32))
291291

292292
return val
293293
}

internal/parsers.go

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

232+
func intOrDefaultGen[T int | int8 | int16 | int32 | int64](key string, defaultVal T) T {
233+
env := stringOrDefault(key, "")
234+
if env == "" {
235+
return defaultVal
236+
}
237+
238+
const (
239+
base = 10
240+
)
241+
242+
var (
243+
bitsize int
244+
castFn func(val int64) T
245+
)
246+
247+
switch any(defaultVal).(type) {
248+
case int:
249+
bitsize = 0
250+
castFn = func(val int64) T {
251+
return any(int(val)).(T)
252+
}
253+
case int8:
254+
bitsize = 8
255+
castFn = func(val int64) T {
256+
return any(int8(val)).(T)
257+
}
258+
case int16:
259+
bitsize = 16
260+
castFn = func(val int64) T {
261+
return any(int16(val)).(T)
262+
}
263+
case int32:
264+
bitsize = 32
265+
castFn = func(val int64) T {
266+
return any(int32(val)).(T)
267+
}
268+
case int64:
269+
bitsize = 64
270+
castFn = func(val int64) T {
271+
return any(val).(T)
272+
}
273+
}
274+
275+
val, err := strconv.ParseInt(env, base, bitsize)
276+
if err != nil {
277+
return defaultVal
278+
}
279+
280+
return castFn(val)
281+
}
282+
232283
// int32SliceOrDefault retrieves the int32 slice value of the environment variable named
233284
// by the key and separated by sep.
234285
// If variable not set or value is empty - defaultVal will be returned.
@@ -365,94 +416,6 @@ func durationSliceOrDefault(key string, defaultVal []time.Duration, separator st
365416
return val
366417
}
367418

368-
// int64OrDefault retrieves the int64 value of the environment variable named
369-
// by the key.
370-
// If variable not set or value is empty - defaultVal will be returned.
371-
func int64OrDefault(key string, defaultVal int64) int64 {
372-
env := stringOrDefault(key, "")
373-
if env == "" {
374-
return defaultVal
375-
}
376-
377-
const (
378-
base = 10
379-
bitsize = 64
380-
)
381-
382-
val, err := strconv.ParseInt(env, base, bitsize)
383-
if err != nil {
384-
return defaultVal
385-
}
386-
387-
return val
388-
}
389-
390-
// int8OrDefault retrieves the int8 value of the environment variable named
391-
// by the key.
392-
// If variable not set or value is empty - defaultVal will be returned.
393-
func int8OrDefault(key string, defaultVal int8) int8 {
394-
env := stringOrDefault(key, "")
395-
if env == "" {
396-
return defaultVal
397-
}
398-
399-
const (
400-
base = 10
401-
bitsize = 8
402-
)
403-
404-
val, err := strconv.ParseInt(env, base, bitsize)
405-
if err != nil {
406-
return defaultVal
407-
}
408-
409-
return int8(val)
410-
}
411-
412-
// int16OrDefault retrieves the int16 value of the environment variable named
413-
// by the key.
414-
// If variable not set or value is empty - defaultVal will be returned.
415-
func int16OrDefault(key string, defaultVal int16) int16 {
416-
env := stringOrDefault(key, "")
417-
if env == "" {
418-
return defaultVal
419-
}
420-
421-
const (
422-
base = 10
423-
bitsize = 16
424-
)
425-
426-
val, err := strconv.ParseInt(env, base, bitsize)
427-
if err != nil {
428-
return defaultVal
429-
}
430-
431-
return int16(val)
432-
}
433-
434-
// int32OrDefault retrieves the int32 value of the environment variable named
435-
// by the key.
436-
// If variable not set or value is empty - defaultVal will be returned.
437-
func int32OrDefault(key string, defaultVal int32) int32 {
438-
env := stringOrDefault(key, "")
439-
if env == "" {
440-
return defaultVal
441-
}
442-
443-
const (
444-
base = 10
445-
bitsize = 32
446-
)
447-
448-
val, err := strconv.ParseInt(env, base, bitsize)
449-
if err != nil {
450-
return defaultVal
451-
}
452-
453-
return int32(val)
454-
}
455-
456419
// float32OrDefault retrieves the float32 value of the environment variable named
457420
// by the key.
458421
// If variable not set or value is empty - defaultVal will be returned.
@@ -946,7 +909,7 @@ func complex128OrDefault(key string, defaultVal complex128) complex128 {
946909

947910
// complex128SliceOrDefault retrieves the complex128 slice value of the environment variable named
948911
// by the key and separated by sep.
949-
// If variable not set or value is empty - defaultVal will be returned.
912+
// If the variable is not set or the value is empty - defaultVal will be returned.
950913
func complex128SliceOrDefault(key string, defaultVal []complex128, sep string) []complex128 {
951914
valraw := stringSliceOrDefault(key, nil, sep)
952915
if valraw == nil {

internal/parsers_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func Test_int64OrDefault(t *testing.T) {
233233
t.Run(tt.name, func(t *testing.T) {
234234
tt.precond.maybeSetEnv(t, tt.args.key)
235235

236-
got := int64OrDefault(tt.args.key, tt.args.defaultVal)
236+
got := intOrDefaultGen(tt.args.key, tt.args.defaultVal)
237237
assert.Equal(t, tt.expected.val, got)
238238
})
239239
}
@@ -309,7 +309,7 @@ func Test_int8OrDefault(t *testing.T) {
309309
t.Run(tt.name, func(t *testing.T) {
310310
tt.precond.maybeSetEnv(t, tt.args.key)
311311

312-
got := int8OrDefault(tt.args.key, tt.args.defaultVal)
312+
got := intOrDefaultGen(tt.args.key, tt.args.defaultVal)
313313
assert.Equal(t, tt.expected.val, got)
314314
})
315315
}
@@ -385,7 +385,7 @@ func Test_int16OrDefault(t *testing.T) {
385385
t.Run(tt.name, func(t *testing.T) {
386386
tt.precond.maybeSetEnv(t, tt.args.key)
387387

388-
got := int16OrDefault(tt.args.key, tt.args.defaultVal)
388+
got := intOrDefaultGen(tt.args.key, tt.args.defaultVal)
389389
assert.Equal(t, tt.expected.val, got)
390390
})
391391
}
@@ -461,7 +461,7 @@ func Test_int32OrDefault(t *testing.T) {
461461
t.Run(tt.name, func(t *testing.T) {
462462
tt.precond.maybeSetEnv(t, tt.args.key)
463463

464-
got := int32OrDefault(tt.args.key, tt.args.defaultVal)
464+
got := intOrDefaultGen(tt.args.key, tt.args.defaultVal)
465465
assert.Equal(t, tt.expected.val, got)
466466
})
467467
}

0 commit comments

Comments
 (0)