util/reflect: add IsZero helper
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
parent
c1dc041d8c
commit
8c95448535
@ -65,8 +65,25 @@ func IsEmpty(v reflect.Value) bool {
|
|||||||
return v.IsNil()
|
return v.IsNil()
|
||||||
case reflect.Invalid:
|
case reflect.Invalid:
|
||||||
return true
|
return true
|
||||||
}
|
case reflect.Struct:
|
||||||
|
var ok bool
|
||||||
|
for i := 0; i < v.NumField(); i++ {
|
||||||
|
ok = IsEmpty(v.FieldByIndex([]int{i}))
|
||||||
|
if !ok {
|
||||||
return false
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fmt.Printf("%#+v\n", v)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsZero returns true if struct is zero (not have any defined values)
|
||||||
|
func IsZero(src interface{}) bool {
|
||||||
|
v := reflect.ValueOf(src)
|
||||||
|
return IsEmpty(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zero creates new zero interface
|
// Zero creates new zero interface
|
||||||
|
@ -43,3 +43,50 @@ func TestURLVars(t *testing.T) {
|
|||||||
}
|
}
|
||||||
_ = mp
|
_ = mp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsZero(t *testing.T) {
|
||||||
|
testStr1 := struct {
|
||||||
|
Name string
|
||||||
|
Value string
|
||||||
|
Nested struct {
|
||||||
|
NestedName string
|
||||||
|
}
|
||||||
|
}{
|
||||||
|
Name: "test_name",
|
||||||
|
Value: "test_value",
|
||||||
|
}
|
||||||
|
testStr1.Nested.NestedName = "nested_name"
|
||||||
|
|
||||||
|
if ok := IsZero(testStr1); ok {
|
||||||
|
t.Fatalf("zero ret on non zero struct: %#+v", testStr1)
|
||||||
|
}
|
||||||
|
|
||||||
|
testStr1.Name = ""
|
||||||
|
testStr1.Value = ""
|
||||||
|
testStr1.Nested.NestedName = ""
|
||||||
|
if ok := IsZero(testStr1); !ok {
|
||||||
|
t.Fatalf("non zero ret on zero struct: %#+v", testStr1)
|
||||||
|
}
|
||||||
|
|
||||||
|
type testStr3 struct {
|
||||||
|
Nested string
|
||||||
|
}
|
||||||
|
type testStr2 struct {
|
||||||
|
Name string
|
||||||
|
Nested *testStr3
|
||||||
|
}
|
||||||
|
vtest := &testStr2{
|
||||||
|
Name: "test_name",
|
||||||
|
Nested: &testStr3{Nested: "nested_name"},
|
||||||
|
}
|
||||||
|
if ok := IsZero(vtest); ok {
|
||||||
|
t.Fatalf("zero ret on non zero struct: %#+v", vtest)
|
||||||
|
}
|
||||||
|
vtest.Nested = nil
|
||||||
|
vtest.Name = ""
|
||||||
|
if ok := IsZero(vtest); !ok {
|
||||||
|
t.Fatalf("non zero ret on zero struct: %#+v", vtest)
|
||||||
|
}
|
||||||
|
|
||||||
|
//t.Logf("XX %#+v\n", ok)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user