Skip to content

Commit d71eb57

Browse files
authored
Merge pull request #13 from Cleverse/feature/utils/default-optional
DefaultOptional Utils
2 parents 1b46583 + 1fc8a2e commit d71eb57

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

Diff for: utils/utils.go

+12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ func Optional[T any](opt []T) (optional T, ok bool) {
2828
return optional, false
2929
}
3030

31+
// DefaultOptional extract optional parameter from variadic function parameter.
32+
// If parameter is not provided or zero value of type T, return defaultValue.
33+
//
34+
// It's useful to reduce boilerplate code when implementing optional parameter. You won't need to check if parameter is provided or not.
35+
func DefaultOptional[T comparable](opt []T, defaultValue T) (result T) {
36+
val, ok := Optional[T](opt)
37+
if ok && val != Empty[T]() {
38+
return val
39+
}
40+
return defaultValue
41+
}
42+
3143
// ToZero alias of Zero. returns zero value of the type of the given value.
3244
func ToZero[T any](value T) (result T) {
3345
return Zero[T](value)

Diff for: utils/utils_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,15 @@ func assertEqualAny(t *testing.T, expected, actual interface{}, msgAndArgs ...in
9191
return expected == actual
9292
}
9393
}
94+
95+
func TestDefaultOptional(t *testing.T) {
96+
f := func(a int, b ...int) int {
97+
_b := DefaultOptional(b, 1)
98+
return a + _b
99+
}
100+
101+
assertEqual(t, 3, f(2))
102+
assertEqual(t, 3, f(2, 0))
103+
assertEqual(t, 3, f(2, 1))
104+
assertEqual(t, 4, f(2, 2))
105+
}

0 commit comments

Comments
 (0)