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