Browse Source

FieldKeys

0x4a52466c696e74 1 year ago
parent
commit
a68b3afe38
3 changed files with 48 additions and 1 deletions
  1. 2 1
      fielder.go
  2. 19 0
      tools.go
  3. 27 0
      z_test.go

+ 2 - 1
fielder.go

@@ -29,7 +29,7 @@ func (s FieldList) Field(name string) (*Field, bool) {
 	return nil, false
 }
 
-// IFielder реадизует интерфейс завершения формирования полей объекта в "ручном" режиме.
+// IFielder реализует интерфейс завершения формирования полей объекта в "ручном" режиме.
 // RestFields будет вызван после завершения автматического формирования полей объекта
 // result - массив с полями, сформированными автоматически, в него можно вносить правки
 // files - глобальный массив файловых дескрипторов, который будет передан в ответе клиенту
@@ -107,6 +107,7 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
 		}
 		// check fieler addr
 		if val.CanAddr() {
+			// check fielder interface
 			if f, check := val.Addr().Interface().(IRestFielder); check {
 				rVal, err := f.RestFields(fieldName, names...)
 				if err != nil {

+ 19 - 0
tools.go

@@ -2,6 +2,7 @@ package rest
 
 import (
 	"io"
+	"reflect"
 
 	"git.ali33.ru/fcg-xvii/go-tools/json"
 )
@@ -139,3 +140,21 @@ func WriteBufSize(w io.Writer, val []byte, lenSize int, field string) IErrorArgs
 	// буфер
 	return WriteBuf(w, val, field)
 }
+
+// ObjectFieldKeys позволяет рекурсивно получить список вложенных объектов запроса для предварительного формирования их в контексте ответа
+func ObjectFieldKeys(l []any) (res json.Map) {
+	res = make(json.Map)
+	t := reflect.TypeOf(res)
+	for _, v := range l {
+		rv := reflect.ValueOf(v)
+		if reflect.ValueOf(v).Kind() == reflect.Map {
+			if rv.CanConvert(t) {
+				m := rv.Convert(t).Interface().(json.Map)
+				if name := m.String("name", ""); len(name) > 0 {
+					res[name] = ObjectFieldKeys(m.Slice("fields", []any{}))
+				}
+			}
+		}
+	}
+	return
+}

+ 27 - 0
z_test.go

@@ -288,3 +288,30 @@ func TestConditions(t *testing.T) {
 	}
 	t.Log(cond)
 }
+
+func TestFieldKeys(t *testing.T) {
+	l := []any{
+		"id",
+		"name",
+		json.Map{
+			"name": "parent",
+			"fields": []any{
+				"id",
+				"name",
+				json.Map{
+					"name":   "child1",
+					"fields": []any{},
+				},
+				json.Map{
+					"name": "child2",
+					"fields": []any{
+						"one",
+					},
+				},
+			},
+		},
+	}
+
+	jm := ObjectFieldKeys(l)
+	jm.LogPretty()
+}