package utils

import (
	"fmt"
	"reflect"
)

func CopyWithReflection(src interface{}, dst interface{}) error {
	srcValue := reflect.ValueOf(src)
	dstValue := reflect.ValueOf(dst)
	if srcValue.Kind() != reflect.Struct || dstValue.Kind() != reflect.Struct {
		return fmt.Errorf("both src and dst must be structs")
	}
	for i := 0; i < srcValue.NumField(); i++ {
		srcField := srcValue.Field(i)
		dstField := dstValue.FieldByName(srcValue.Type().Field(i).Name)
		if !dstField.IsValid() {
			continue // 如果目标结构体没有该字段，则跳过
		}
		// 检查类型是否匹配，如果需要转换类型，可以在这里添加转换代码
		if srcField.Type() != dstField.Type() {
			return fmt.Errorf("field types don't match: %s", srcValue.Type().Field(i).Name)
		}
		dstField.Set(srcField)
	}
	return nil
}
