浏览代码

fields fixed

0x4a52466c696e74 1 年之前
父节点
当前提交
75116ed09a
共有 2 个文件被更改,包括 87 次插入7 次删除
  1. 43 7
      fielder.go
  2. 44 0
      z_test.go

+ 43 - 7
fielder.go

@@ -2,6 +2,7 @@ package rest
 
 import (
 	"fmt"
+	"log"
 	"reflect"
 	"strings"
 
@@ -42,7 +43,19 @@ func fieldsDefault(t reflect.Type) (res []any) {
 		fType := t.Field(i)
 		// проверяем тег, если он есть
 		tag := fType.Tag.Get("rest")
-		if len(tag) > 0 && strings.Contains(tag, "default") {
+		if len(tag) > 0 && (strings.Contains(tag, "default") || strings.Contains(tag, "fixed")) {
+			res = append(res, camelToSnake(fType.Name))
+		}
+	}
+	return
+}
+
+func fieldsFixed(t reflect.Type) (res []any) {
+	for i := 0; i < t.NumField(); i++ {
+		fType := t.Field(i)
+		// проверяем тег, если он есть
+		tag := fType.Tag.Get("rest")
+		if len(tag) > 0 && strings.Contains(tag, "fixed") {
 			res = append(res, camelToSnake(fType.Name))
 		}
 	}
@@ -86,6 +99,7 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 		return fieldVal(val.Elem(), fieldName, files, names...)
 	case reflect.Struct:
 		// check fielder interface
+		log.Println("STRUCT...", names)
 		if f, check := val.Interface().(IRestFielder); check {
 			rVal, err := f.RestFields(fieldName, names...)
 			if err != nil {
@@ -109,13 +123,12 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 		}
 		jm := json.Map{}
 		var fields FieldList
-	loop:
-		for _, name := range names {
+		addFieldVal := func(name any) bool {
 			rField, rErr := parseName(reflect.ValueOf(name))
 			if rErr != nil {
 				message := fmt.Sprintf("%v: %v", name, err)
 				err = ErrorFiled(fieldName, message)
-				return
+				return false
 			}
 			fields = append(fields, rField)
 			var field reflect.Value
@@ -124,7 +137,7 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 				if camelToSnake(f.Name) == rField.Name {
 					tag := f.Tag.Get("rest")
 					if len(tag) > 0 && strings.Contains(tag, "ignore") {
-						continue loop
+						return true
 					}
 					field = val.Field(i)
 					break
@@ -132,7 +145,7 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 			}
 			if !field.IsValid() {
 				err = ErrorFiled(rField.Name, "field is not found")
-				return
+				return false
 			}
 			var fVal reflect.Value
 			if fVal, err = fieldVal(
@@ -141,9 +154,22 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 				files,
 				rField.Names...,
 			); err != nil {
-				return
+				return false
 			}
 			jm[rField.Name] = fVal.Interface()
+			return true
+		}
+		for _, name := range names {
+			if !addFieldVal(name) {
+				return
+			}
+		}
+		// fields fixed
+		fFixed := fieldsFixed(val.Type())
+		for _, fixed := range fFixed {
+			if !jm.KeyExists(fixed.(string)) {
+				addFieldVal(fixed)
+			}
 		}
 		// post (когда результирующий объект уже сформирован)
 		if fielder, check := val.Interface().(IFielderPost); check {
@@ -157,6 +183,7 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 
 		return
 	case reflect.Slice:
+		log.Println("SLICE...", names)
 		sl := make([]any, val.Len())
 		for i := 0; i < val.Len(); i++ {
 			fName := fmt.Sprintf("%v[%v]", fieldName, i)
@@ -193,6 +220,15 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 	}
 }
 
+func FieldsAny(obj any, files RequestFiles, names ...any) (any, IErrorArgs) {
+	sVal := reflect.ValueOf(obj)
+	rVal, err := fieldVal(sVal.Elem(), "", files, names...)
+	if err != nil {
+		return nil, err
+	}
+	return rVal.Interface(), nil
+}
+
 // Fields позволяет получить значения объекта в json
 func Fields(obj any, files RequestFiles, names ...any) (json.Map, IErrorArgs) {
 	sVal := reflect.ValueOf(obj)

+ 44 - 0
z_test.go

@@ -187,3 +187,47 @@ func TestTime(t *testing.T) {
 	}
 	t.Log(rObj)
 }
+
+type LObj struct {
+	ID   int64  `rest:"default"`
+	Name string `rest:"default"`
+}
+
+type LList struct {
+	Result []*LObj `rest:"fixed"`
+}
+
+func (s *LList) RestFields(fieldName string, names ...any) (any, IErrorArgs) {
+	if fieldName == "" {
+		l, err := FieldsAny(&s.Result, nil, names...)
+		if err != nil {
+			return nil, err
+		}
+		rm := json.Map{
+			"llist": l,
+		}
+		return rm, nil
+	}
+	return nil, ErrorFiled(fieldName, "field is not exists")
+}
+
+func TestFielderList(t *testing.T) {
+	obj := &LList{
+		Result: []*LObj{
+			{
+				ID:   1,
+				Name: "Val 1",
+			},
+			{
+				ID:   2,
+				Name: "Val 2",
+			},
+		},
+	}
+
+	m, err := Fields(obj, nil, "id")
+	if err != nil {
+		t.Fatal(err)
+	}
+	m.LogPretty()
+}