|
@@ -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)
|