Skip to content

Commit

Permalink
Add new function reflect.IsValidatePtr (#163)
Browse files Browse the repository at this point in the history
  • Loading branch information
tim1116 committed Mar 11, 2024
1 parent 08ec3bd commit 5c01479
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 1 deletion.
5 changes: 5 additions & 0 deletions reflects/check.go
Expand Up @@ -58,6 +58,11 @@ func IsNil(v reflect.Value) bool {
}
}

// IsValidatePtr check variable is a valid pointer.
func IsValidatePtr(v reflect.Value) bool {
return v.IsValid() && (v.Kind() == reflect.Ptr) && !v.IsNil()
}

// CanBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero.
func CanBeNil(typ reflect.Type) bool {
switch typ.Kind() {
Expand Down
10 changes: 10 additions & 0 deletions reflects/check_test.go
Expand Up @@ -16,6 +16,16 @@ func TestIsNil(t *testing.T) {
assert.True(t, reflects.IsNil(reflect.ValueOf(v)))
}

func TestIsValidatePtr(t *testing.T) {
assert.False(t, reflects.IsValidatePtr(reflect.ValueOf(nil)))

assert.False(t, reflects.IsValidatePtr(reflect.ValueOf((*int)(nil))))

var s string
assert.False(t, reflects.IsValidatePtr(reflect.ValueOf(s)))
assert.True(t, reflects.IsValidatePtr(reflect.ValueOf(&s)))
}

func TestIsFunc(t *testing.T) {
assert.False(t, reflects.IsFunc(nil))
assert.True(t, reflects.IsFunc(reflects.HasChild))
Expand Down
2 changes: 1 addition & 1 deletion structs/init.go
Expand Up @@ -49,7 +49,7 @@ func Init(ptr any, optFns ...InitOptFunc) error {
// fmt.Printf("%+v\n", u1) // Output: {Name:inhere Age:30}
func InitDefaults(ptr any, optFns ...InitOptFunc) error {
rv := reflect.ValueOf(ptr)
if rv.Kind() != reflect.Ptr {
if !reflects.IsValidatePtr(rv) {
return errors.New("must be provider an pointer value")
}

Expand Down
7 changes: 7 additions & 0 deletions structs/init_test.go
Expand Up @@ -44,6 +44,13 @@ func TestInitDefaults_error(t *testing.T) {
err := structs.InitDefaults([]string{"invalid"})
assert.ErrMsg(t, err, "must be provider an pointer value")

err = structs.InitDefaults(nil)
assert.ErrMsg(t, err, "must be provider an pointer value")

var i1 *int
err = structs.InitDefaults(i1)
assert.ErrMsg(t, err, "must be provider an pointer value")

arr := []string{"invalid"}
err = structs.InitDefaults(&arr)
assert.ErrMsg(t, err, "must be provider an struct value")
Expand Down

0 comments on commit 5c01479

Please sign in to comment.