|
@@ -8,6 +8,10 @@ import (
|
|
|
"git.ali33.ru/fcg-xvii/go-tools/json"
|
|
|
)
|
|
|
|
|
|
+type IRestFielder interface {
|
|
|
+ RestFields(fieldName string, names ...any) (any, IErrorArgs)
|
|
|
+}
|
|
|
+
|
|
|
// Field реализует ...
|
|
|
type Field struct {
|
|
|
Name string
|
|
@@ -29,8 +33,8 @@ func (s FieldList) Field(name string) (*Field, bool) {
|
|
|
// RestFields будет вызван после завершения автматического формирования полей объекта
|
|
|
// result - массив с полями, сформированными автоматически, в него можно вносить правки
|
|
|
// files - глобальный массив файловых дескрипторов, который будет передан в ответе клиенту
|
|
|
-type IFielder interface {
|
|
|
- RestFields(result json.Map, files map[string]IReadCloserLen, names FieldList)
|
|
|
+type IFielderPost interface {
|
|
|
+ RestFieldsPost(result json.Map, files map[string]IReadCloserLen, names FieldList)
|
|
|
}
|
|
|
|
|
|
func fieldsDefault(t reflect.Type) (res []any) {
|
|
@@ -81,6 +85,25 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
|
|
|
case reflect.Ptr, reflect.Interface:
|
|
|
return fieldVal(val.Elem(), fieldName, files, names...)
|
|
|
case reflect.Struct:
|
|
|
+ // check fielder interface
|
|
|
+ if f, check := val.Interface().(IRestFielder); check {
|
|
|
+ rVal, err := f.RestFields(fieldName, names...)
|
|
|
+ if err != nil {
|
|
|
+ return reflect.Value{}, err
|
|
|
+ }
|
|
|
+ return reflect.ValueOf(rVal), nil
|
|
|
+ }
|
|
|
+ // check fieler addr
|
|
|
+ if val.CanAddr() {
|
|
|
+ if f, check := val.Addr().Interface().(IRestFielder); check {
|
|
|
+ rVal, err := f.RestFields(fieldName, names...)
|
|
|
+ if err != nil {
|
|
|
+ return reflect.Value{}, err
|
|
|
+ }
|
|
|
+ return reflect.ValueOf(rVal), nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // parse struct public fields
|
|
|
if len(names) == 0 {
|
|
|
names = fieldsDefault(val.Type())
|
|
|
}
|
|
@@ -122,11 +145,12 @@ func fieldVal(val reflect.Value, fieldName string, files RequestFiles, names ...
|
|
|
}
|
|
|
jm[rField.Name] = fVal.Interface()
|
|
|
}
|
|
|
- if fielder, check := val.Interface().(IFielder); check {
|
|
|
- fielder.RestFields(jm, files, fields)
|
|
|
+ // post (когда результирующий объект уже сформирован)
|
|
|
+ if fielder, check := val.Interface().(IFielderPost); check {
|
|
|
+ fielder.RestFieldsPost(jm, files, fields)
|
|
|
} else if val.CanAddr() {
|
|
|
- if fielder, check := val.Addr().Interface().(IFielder); check {
|
|
|
- fielder.RestFields(jm, files, fields)
|
|
|
+ if fielder, check := val.Addr().Interface().(IFielderPost); check {
|
|
|
+ fielder.RestFieldsPost(jm, files, fields)
|
|
|
}
|
|
|
}
|
|
|
res = reflect.ValueOf(jm)
|