| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // Package nullify provides methods to init nil values structs for test assertion.
- package nullify
- import (
- "reflect"
- "unsafe"
- sdk "github.com/cosmos/cosmos-sdk/types"
- )
- var (
- coinType = reflect.TypeOf(sdk.Coin{})
- coinsType = reflect.TypeOf(sdk.Coins{})
- )
- // Fill analyze all struct fields and slices with
- // reflection and initialize the nil and empty slices,
- // structs, and pointers.
- func Fill(x interface{}) interface{} {
- v := reflect.Indirect(reflect.ValueOf(x))
- switch v.Kind() {
- case reflect.Slice:
- for i := 0; i < v.Len(); i++ {
- obj := v.Index(i)
- objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface()
- objPt = Fill(objPt)
- obj.Set(reflect.ValueOf(objPt))
- }
- case reflect.Struct:
- for i := 0; i < v.NumField(); i++ {
- f := reflect.Indirect(v.Field(i))
- if !f.CanSet() {
- continue
- }
- switch f.Kind() {
- case reflect.Slice:
- f.Set(reflect.MakeSlice(f.Type(), 0, 0))
- case reflect.Struct:
- switch f.Type() {
- case coinType:
- coin := reflect.New(coinType).Interface()
- s := reflect.ValueOf(coin).Elem()
- f.Set(s)
- case coinsType:
- coins := reflect.New(coinsType).Interface()
- s := reflect.ValueOf(coins).Elem()
- f.Set(s)
- default:
- objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface()
- s := Fill(objPt)
- f.Set(reflect.ValueOf(s))
- }
- }
- }
- }
- return reflect.Indirect(v).Interface()
- }
|