package utils

import (
	"reflect"

	"github.com/pingcap/log"
	"go.uber.org/zap"
)

func RecursiveDefineObject(typ reflect.Type, val reflect.Value) {
	log.Info("", zap.String("type", typ.String()), zap.String("kind", typ.Kind().String()), zap.String("name", val.String()))
	for i := 0; i < val.NumField(); i++ {
		f := val.Field(i)
		ft := typ.Field(i)
		switch ft.Type.Kind() {
		case reflect.Struct:
			RecursiveDefineObject(ft.Type, f)
		case reflect.Ptr:
			if ft.Type.Elem().Kind() == reflect.Struct && f.IsNil() {
				fv := reflect.New(ft.Type.Elem())
				RecursiveDefineObject(ft.Type.Elem(), fv.Elem())
				f.Set(fv)
			}
		default:
		}
	}
}
