|
@@ -2,6 +2,7 @@ package rest
|
|
|
|
|
|
import (
|
|
import (
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "log"
|
|
"reflect"
|
|
"reflect"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
@@ -35,6 +36,7 @@ func parseVal(from, to reflect.Value, fieldName string) IErrorArgs {
|
|
func parseType(from, to reflect.Value, fieldName string) IErrorArgs {
|
|
func parseType(from, to reflect.Value, fieldName string) IErrorArgs {
|
|
from = realValue(from)
|
|
from = realValue(from)
|
|
to = realValue(to)
|
|
to = realValue(to)
|
|
|
|
+ log.Println("=== to", to.Kind(), to.Type().Name())
|
|
switch to.Kind() {
|
|
switch to.Kind() {
|
|
case reflect.Interface:
|
|
case reflect.Interface:
|
|
if from.Kind() != reflect.Invalid {
|
|
if from.Kind() != reflect.Invalid {
|
|
@@ -97,6 +99,7 @@ func parseStruct(from, to reflect.Value, fieldName string) IErrorArgs {
|
|
return f.RestFrom(from.Interface())
|
|
return f.RestFrom(from.Interface())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+loop:
|
|
for i := 0; i < to.NumField(); i++ {
|
|
for i := 0; i < to.NumField(); i++ {
|
|
required := false
|
|
required := false
|
|
// устанавливаем тип и указатель поля объекта, куда копируем
|
|
// устанавливаем тип и указатель поля объекта, куда копируем
|
|
@@ -104,6 +107,18 @@ func parseStruct(from, to reflect.Value, fieldName string) IErrorArgs {
|
|
fVal := to.Field(i)
|
|
fVal := to.Field(i)
|
|
// проверяем тег, если он есть
|
|
// проверяем тег, если он есть
|
|
tag := fType.Tag.Get("rest")
|
|
tag := fType.Tag.Get("rest")
|
|
|
|
+ if fType.Type.Kind() == reflect.Ptr {
|
|
|
|
+ elem := fType.Type.Elem()
|
|
|
|
+ if elem.Kind() == reflect.Struct {
|
|
|
|
+ if fVal.IsNil() {
|
|
|
|
+ fVal.Set(reflect.New(elem))
|
|
|
|
+ if ierr := parseStruct(from, fVal.Elem(), prefixFieldName(fieldName, fType.Name)); ierr != nil {
|
|
|
|
+ return ierr
|
|
|
|
+ }
|
|
|
|
+ continue loop
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if len(tag) > 0 {
|
|
if len(tag) > 0 {
|
|
required = strings.Contains(tag, "required")
|
|
required = strings.Contains(tag, "required")
|
|
}
|
|
}
|