支持传入的跟结构就是数组
This commit is contained in:
44
builder.go
44
builder.go
@ -178,6 +178,9 @@ func (b *builderImpl) Build() IDynamicStruct {
|
||||
for deep := b.maxFieldDeep - 1; deep > 0; deep-- {
|
||||
// 嵌套数据结构
|
||||
for parentIndex, builderCfg := range b.nestedStructTable {
|
||||
if parentIndex == ArrayRootFlag {
|
||||
continue
|
||||
}
|
||||
parentNameArr := strings.Split(parentIndex, ".")
|
||||
if len(parentNameArr) != deep {
|
||||
// 从深度最深处向上处理
|
||||
@ -201,24 +204,40 @@ func (b *builderImpl) Build() IDynamicStruct {
|
||||
}
|
||||
if arrDeep > 0 {
|
||||
// 数组嵌套数组配置
|
||||
val := reflect.ValueOf(builderCfg.Builder.Build().New()).Elem().Interface()
|
||||
val := reflect.ValueOf(builderCfg.Builder.Build().New()).Interface()
|
||||
for i := 0; i < arrDeep; i++ {
|
||||
val = reflect.New(reflect.SliceOf(reflect.TypeOf(val))).Interface()
|
||||
val = reflect.New(reflect.SliceOf(reflect.TypeOf(val).Elem())).Interface()
|
||||
// 删除数组记录
|
||||
arrPath := strings.Join(parentNameArr[:len(parentNameArr)-i], ".")
|
||||
delete(b.nestedStructTable, arrPath)
|
||||
}
|
||||
// 解除指针引用
|
||||
// val = reflect.ValueOf(val).Elem().Interface()
|
||||
newParamIndex := strings.Join(newParentNameArr, ".")
|
||||
newParentIndex := strings.Join(newParentNameArr, ".")
|
||||
isTopIndex := len(newParentNameArr) == 1
|
||||
if isTopIndex {
|
||||
// 顶层结构, 数组类型不存在还有其他属性情况, 直接追加字段, 并移除嵌套表里的定义
|
||||
b.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
b.AddField(b.nestedStructTable[newParentIndex].Field, "", val, b.nestedStructTable[newParentIndex].Tag, false)
|
||||
// b.nestedStructTable[newParamIndex].Builder.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
} else {
|
||||
// 非顶层结构, 再上探一级
|
||||
b.nestedStructTable[strings.Join(newParentNameArr[:len(newParentNameArr)-1], ".")].Builder.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
newParentName := ""
|
||||
fieldName := ""
|
||||
if len(newParentNameArr) == 0 {
|
||||
// 说明传入的直接就是数组
|
||||
newParentName = ArrayRootFlag
|
||||
fieldName = ArrayRootFlag
|
||||
b.nestedStructTable[newParentName] = nestedStruct{
|
||||
Field: fieldName,
|
||||
Builder: NewStruct(b.structTagTable),
|
||||
Tag: "",
|
||||
}
|
||||
b.nestedStructTable[newParentName].Builder.AddField(b.nestedStructTable[newParentName].Field, "", reflect.ValueOf(val).Elem().Interface(), b.nestedStructTable[newParentName].Tag, false)
|
||||
} else {
|
||||
newParentName = strings.Join(newParentNameArr[:len(newParentNameArr)-1], ".")
|
||||
b.nestedStructTable[newParentName].Builder.AddField(b.nestedStructTable[newParentIndex].Field, "", reflect.ValueOf(val).Elem().Interface(), b.nestedStructTable[newParentIndex].Tag, false)
|
||||
}
|
||||
}
|
||||
// 嵌套结构中删除数组字段
|
||||
delete(b.nestedStructTable, newParamIndex)
|
||||
delete(b.nestedStructTable, newParentIndex)
|
||||
} else {
|
||||
// 非数组
|
||||
// (非顶层) 父级结构存在, 将其追加到父级结构中即可, 向前看一步即为父级结构
|
||||
@ -227,6 +246,15 @@ func (b *builderImpl) Build() IDynamicStruct {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if nestedCfg, exist := b.nestedStructTable[ArrayRootFlag]; exist {
|
||||
// 说明是传入的根路径就是数组
|
||||
return &dynamicStructImpl{
|
||||
structFields: nil,
|
||||
definition: reflect.TypeOf(nestedCfg.Builder.GetField(ArrayRootFlag).GetType()),
|
||||
}
|
||||
}
|
||||
|
||||
// 一级字段属性
|
||||
var structFields []reflect.StructField
|
||||
for _, field := range b.fields {
|
||||
|
Reference in New Issue
Block a user