浏览代码

pointer serialize

0x4a52466c696e74 3 月之前
父节点
当前提交
f9975cf1e4
共有 3 个文件被更改,包括 48 次插入29 次删除
  1. 22 21
      field_converter.go
  2. 12 4
      fielder.go
  3. 14 4
      z_test.go

+ 22 - 21
field_converter.go

@@ -18,26 +18,27 @@ func RegisterFieldConverter(name string, converter *FieldConverter) {
 	fieldConverters[name] = converter
 }
 
-func init() {
-	RegisterFieldConverter(
-		"time.Time",
-		&FieldConverter{
-			Pack: func(v any) any {
-				t := v.(time.Time)
-				return t.Format("02.01.2006 15:04")
-			},
-			Unpack: func(val any) (any, error) {
-				ts, check := val.(string)
-				if !check {
-					return nil, fmt.Errorf("expected string")
-				}
-				layout := "02.01.2006 15:04"
-				parsedTime, err := time.Parse(layout, ts)
-				if err != nil {
-					return nil, err
-				}
-				return parsedTime, nil
-			},
+var (
+	fcTime = &FieldConverter{
+		Pack: func(v any) any {
+			t := v.(time.Time)
+			return t.Format("02.01.2006 15:04")
+		},
+		Unpack: func(val any) (any, error) {
+			ts, check := val.(string)
+			if !check {
+				return nil, fmt.Errorf("expected string")
+			}
+			layout := "02.01.2006 15:04"
+			parsedTime, err := time.Parse(layout, ts)
+			if err != nil {
+				return nil, err
+			}
+			return parsedTime, nil
 		},
-	)
+	}
+)
+
+func init() {
+	RegisterFieldConverter("time.Time", fcTime)
 }

+ 12 - 4
fielder.go

@@ -3,7 +3,6 @@ package rest
 import (
 	"errors"
 	"fmt"
-	"log"
 	"reflect"
 	"strings"
 
@@ -172,6 +171,9 @@ func parseName(val reflect.Value) (res *Field, err error) {
 
 func StructTypeName(val reflect.Value) string {
 	t := val.Type()
+	if t.Kind() == reflect.Pointer {
+		t = t.Elem()
+	}
 	return t.PkgPath() + "." + t.Name()
 }
 
@@ -239,7 +241,11 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names Fie
 				stn := StructTypeName(field)
 				con, check := fieldConverters[stn]
 				if check {
-					jm[name.Name] = con.Pack(field.Interface())
+					if field.Kind() == reflect.Ptr {
+						jm[name.Name] = con.Pack(field.Elem().Interface())
+					} else {
+						jm[name.Name] = con.Pack(field.Interface())
+					}
 				} else {
 					jm[name.Name] = fVal.Interface()
 				}
@@ -321,8 +327,10 @@ func FieldsAny(obj any, files RequestFiles, names FieldList) (any, IErrorArgs) {
 // Fields позволяет получить значения объекта в json
 func Fields(obj any, files RequestFiles, names FieldList) (json.Map, IErrorArgs) {
 	sVal := reflect.ValueOf(obj)
-	log.Println(sVal)
-	rVal, err := fieldVal(sVal.Elem(), "", files, names)
+	if sVal.Kind() == reflect.Pointer {
+		sVal = sVal.Elem()
+	}
+	rVal, err := fieldVal(sVal, "", files, names)
 	if err != nil {
 		return nil, err
 	}

+ 14 - 4
z_test.go

@@ -408,6 +408,8 @@ type AuthEmail struct {
 	ThemeName string `rest:"required"`
 	UUser     *User
 	Fields    []any
+	T         time.Time
+	TP        *time.Time
 }
 
 func (s *AuthEmail) Validate(req IRequestIn) IRequestOut {
@@ -442,6 +444,8 @@ func TestSerializeEmail(t *testing.T) {
 			"Created":  "10.11.1983 03:12",
 			"ParentID": nil,
 		},
+		"T":  "10.11.1983 03:12",
+		"TP": "10.11.1983 03:12",
 	}
 
 	r := &AuthEmail{}
@@ -451,7 +455,7 @@ func TestSerializeEmail(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	t.Log(r, *r.UUser, r.UUser.ParentID)
+	t.Log(r, *r.UUser, r.UUser.ParentID, r.T, "TP", r.TP)
 	//t.Log(*r.UUser.ParentID)
 
 }
@@ -472,14 +476,20 @@ type RFielder struct {
 	ID    int `rest:"default"`
 	Name  string
 	Count int
+	T     time.Time  `rest:"default"`
+	T1    *time.Time `rest:"default"`
 }
 
 func TestFielderObject(t *testing.T) {
+	tn := time.Now()
 	sl := []*RFielder{
-		{ID: 1, Name: "one"},
-		{ID: 2, Name: "two"},
+		//{ID: 1, Name: "one", T: time.Now()},
+		{ID: 2, Name: "two", T1: &tn},
 	}
-	rm, err := Fields(sl, nil, nil)
+	sm := json.Map{
+		"arr": sl,
+	}
+	rm, err := Fields(sm, nil, nil)
 	if err != nil {
 		t.Fatal(err)
 	}