Skip to content

Commit fdbd551

Browse files
authored
feat(values): Add IsType/IsZero/IsEmpty (#184)
Signed-off-by: Flc゛ <[email protected]>
1 parent 62ba336 commit fdbd551

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

Diff for: values/values.go

+27
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,30 @@ func Val[T any](value *T) T {
136136
var zero T
137137
return zero
138138
}
139+
140+
// IsType returns true if the value is the type.
141+
//
142+
// IsType[int](1) // true
143+
// IsType[int]("foo") // false
144+
func IsType[T any](value any) bool {
145+
_, ok := value.(T)
146+
return ok
147+
}
148+
149+
// IsZero returns true if the value is zero.
150+
//
151+
// IsZero(0) // true
152+
// IsZero("") // true
153+
// IsZero("foo") // false
154+
func IsZero[T comparable](value T) bool {
155+
var zero T
156+
return value == zero
157+
}
158+
159+
// IsEmpty returns true if the value is zero.
160+
//
161+
// IsEmpty(0) // true
162+
// IsEmpty("") // true
163+
func IsEmpty[T comparable](value T) bool {
164+
return IsZero(value)
165+
}

Diff for: values/values_test.go

+64
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package values
22

33
import (
4+
"errors"
45
"strconv"
56
"testing"
67
"time"
@@ -13,6 +14,14 @@ type foo struct {
1314
Age int
1415
}
1516

17+
type testInterface interface {
18+
testFunc()
19+
}
20+
21+
type testStruct struct{}
22+
23+
func (t testStruct) testFunc() {}
24+
1625
func TestTap_Struct(t *testing.T) {
1726
f := &foo{Name: "foo"}
1827

@@ -245,3 +254,58 @@ func TestPtrAndVal(t *testing.T) {
245254
got6 := Val(nilVal)
246255
assert.Equal(t, 0, got6)
247256
}
257+
258+
func TestIsType(t *testing.T) {
259+
assert.True(t, IsType[int](10))
260+
assert.False(t, IsType[int](int8(10)))
261+
262+
assert.True(t, IsType[string]("foo"))
263+
assert.False(t, IsType[string](10))
264+
265+
assert.True(t, IsType[time.Time](time.Now()))
266+
assert.False(t, IsType[time.Time](10))
267+
268+
assert.True(t, IsType[foo](foo{}))
269+
assert.False(t, IsType[foo](10))
270+
271+
assert.True(t, IsType[*foo](&foo{}))
272+
assert.False(t, IsType[foo](&foo{}))
273+
assert.False(t, IsType[*foo](nil))
274+
275+
assert.True(t, IsType[testInterface](testStruct{}))
276+
assert.True(t, IsType[interface{}](testStruct{}))
277+
assert.True(t, IsType[any](testStruct{}))
278+
279+
assert.True(t, IsType[error](errors.New("foo")))
280+
assert.False(t, IsType[error](nil))
281+
}
282+
283+
func TestIsZero(t *testing.T) {
284+
assert.True(t, IsZero(0))
285+
assert.True(t, IsZero(""))
286+
assert.True(t, IsZero(false))
287+
assert.True(t, IsZero[*foo](nil))
288+
assert.True(t, IsZero(0.0))
289+
assert.True(t, IsZero(0.0+0i))
290+
291+
assert.False(t, IsZero(1))
292+
assert.False(t, IsZero("foo"))
293+
assert.False(t, IsZero(true))
294+
assert.False(t, IsZero(1.0))
295+
assert.False(t, IsZero(1.0+0i))
296+
}
297+
298+
func TestIsEmpty(t *testing.T) {
299+
assert.True(t, IsEmpty(""))
300+
assert.True(t, IsEmpty[*foo](nil))
301+
assert.True(t, IsEmpty(0))
302+
assert.True(t, IsEmpty(false))
303+
assert.True(t, IsEmpty(0.0))
304+
assert.True(t, IsEmpty(0.0+0i))
305+
306+
assert.False(t, IsEmpty("foo"))
307+
assert.False(t, IsEmpty(1))
308+
assert.False(t, IsEmpty(true))
309+
assert.False(t, IsEmpty(1.0))
310+
assert.False(t, IsEmpty(1.0+0i))
311+
}

0 commit comments

Comments
 (0)