// Package utils -----------------------------
// @file      : requestDataToProto.go
// @author    : JJXu
// @contact   : wavingbear@163.com
// @time      : 2023/8/28 17:57
// -------------------------------------------
package utils

import (
	"reflect"
	"strings"
)

// http请求转proto请求
func RequestDataConvert(from interface{}, to interface{}) {
	var proxyField = "Query"
	fromValue := reflect.ValueOf(from)
	toValue := reflect.ValueOf(to)
	toType := reflect.TypeOf(to)

	// 获取From结构体的字段信息
	fromType := fromValue.Type().Elem()
	for i := 0; i < fromType.NumField(); i++ {
		// 获取字段名和字段值
		fieldName := fromType.Field(i).Name
		fieldValue := fromValue.Elem().FieldByName(fieldName)
		if fieldName != proxyField {
			_, exists := toType.Elem().FieldByName(fieldName)
			if exists {
				// 设置To结构体中相应字段的值
				toValue.Elem().FieldByName(fieldName).Set(fieldValue)
			}
		}
	}
	queryField, exists := toType.Elem().FieldByName(proxyField)
	if exists {
		var queryFieldTypeName string
		// 指针类型额外处理,拿到真实的数据类型
		if queryField.Type.Kind() == reflect.Ptr {
			queryFieldTypeName = queryField.Type.Elem().String()
		} else {
			queryFieldTypeName = queryField.Type.Kind().String()
		}
		//处理拿到的结构体类型如 utils.xxxx的类型,去掉utils.这部分
		if strings.Contains(queryFieldTypeName, ".") {
			queryFieldTypeName = strings.Split(queryFieldTypeName, ".")[1]
		}
		fromQueryValue := fromValue.Elem().FieldByName(queryFieldTypeName)
		toValue.Elem().FieldByName(proxyField).Set(fromQueryValue.Addr())
	}
}