|
|
|
|
@ -55,122 +55,6 @@ func CreateCValue (value any) CValue {
|
|
|
|
|
var idxT,idxC int
|
|
|
|
|
switch value.(type) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
case string : idxT,idxC = idxCValueTypeString,0
|
|
|
|
|
case *string : idxT,idxC = idxCValueTypeString,1
|
|
|
|
|
case []string : idxT,idxC = idxCValueTypeString,2
|
|
|
|
|
case func()string : idxT,idxC = idxCValueTypeString,3
|
|
|
|
|
|
|
|
|
|
case bool : idxT,idxC = idxCValueTypeBool,0
|
|
|
|
|
case *bool : idxT,idxC = idxCValueTypeBool,1
|
|
|
|
|
case []bool : idxT,idxC = idxCValueTypeBool,2
|
|
|
|
|
case func()bool : idxT,idxC = idxCValueTypeBool,3
|
|
|
|
|
|
|
|
|
|
case int : idxT,idxC = idxCValueTypeInt,0
|
|
|
|
|
case *int : idxT,idxC = idxCValueTypeInt,1
|
|
|
|
|
case []int : idxT,idxC = idxCValueTypeInt,2
|
|
|
|
|
case func()int : idxT,idxC = idxCValueTypeInt,3
|
|
|
|
|
|
|
|
|
|
case int8 : idxT,idxC = idxCValueTypeInt8,0
|
|
|
|
|
case *int8 : idxT,idxC = idxCValueTypeInt8,1
|
|
|
|
|
case []int8 : idxT,idxC = idxCValueTypeInt8,2
|
|
|
|
|
case func()int8 : idxT,idxC = idxCValueTypeInt8,3
|
|
|
|
|
|
|
|
|
|
case int16 : idxT,idxC = idxCValueTypeInt16,0
|
|
|
|
|
case *int16 : idxT,idxC = idxCValueTypeInt16,1
|
|
|
|
|
case []int16 : idxT,idxC = idxCValueTypeInt16,2
|
|
|
|
|
case func()int16 : idxT,idxC = idxCValueTypeInt16,3
|
|
|
|
|
|
|
|
|
|
case int32 : idxT,idxC = idxCValueTypeInt32,0
|
|
|
|
|
case *int32 : idxT,idxC = idxCValueTypeInt32,1
|
|
|
|
|
case []int32 : idxT,idxC = idxCValueTypeInt32,2
|
|
|
|
|
case func()int32 : idxT,idxC = idxCValueTypeInt32,3
|
|
|
|
|
|
|
|
|
|
case int64 : idxT,idxC = idxCValueTypeInt64,0
|
|
|
|
|
case *int64 : idxT,idxC = idxCValueTypeInt64,1
|
|
|
|
|
case []int64 : idxT,idxC = idxCValueTypeInt64,2
|
|
|
|
|
case func()int64 : idxT,idxC = idxCValueTypeInt64,3
|
|
|
|
|
|
|
|
|
|
case uint : idxT,idxC = idxCValueTypeUint,0
|
|
|
|
|
case *uint : idxT,idxC = idxCValueTypeUint,1
|
|
|
|
|
case []uint : idxT,idxC = idxCValueTypeUint,2
|
|
|
|
|
case func()uint : idxT,idxC = idxCValueTypeUint,3
|
|
|
|
|
|
|
|
|
|
case uint8 : idxT,idxC = idxCValueTypeUint8,0
|
|
|
|
|
case *uint8 : idxT,idxC = idxCValueTypeUint8,1
|
|
|
|
|
// ya esta contemplado en el array de constructores
|
|
|
|
|
// que este tipo se convierta en CValueTypes
|
|
|
|
|
case []uint8 : idxT,idxC = idxCValueTypeUint8,2
|
|
|
|
|
case func()uint8 : idxT,idxC = idxCValueTypeUint8,3
|
|
|
|
|
|
|
|
|
|
case uint16 : idxT,idxC = idxCValueTypeUint16,0
|
|
|
|
|
case *uint16 : idxT,idxC = idxCValueTypeUint16,1
|
|
|
|
|
case []uint16 : idxT,idxC = idxCValueTypeUint16,2
|
|
|
|
|
case func()uint16 : idxT,idxC = idxCValueTypeUint16,3
|
|
|
|
|
|
|
|
|
|
case uint32 : idxT,idxC = idxCValueTypeUint32,0
|
|
|
|
|
case *uint32 : idxT,idxC = idxCValueTypeUint32,1
|
|
|
|
|
case []uint32 : idxT,idxC = idxCValueTypeUint32,2
|
|
|
|
|
case func()uint32 : idxT,idxC = idxCValueTypeUint32,3
|
|
|
|
|
|
|
|
|
|
case uint64 : idxT,idxC = idxCValueTypeUint64,0
|
|
|
|
|
case *uint64 : idxT,idxC = idxCValueTypeUint64,1
|
|
|
|
|
case []uint64 : idxT,idxC = idxCValueTypeUint64,2
|
|
|
|
|
case func()uint64 : idxT,idxC = idxCValueTypeUint64,3
|
|
|
|
|
|
|
|
|
|
case float32 : idxT,idxC = idxCValueTypeFloat32,0
|
|
|
|
|
case *float32 : idxT,idxC = idxCValueTypeFloat32,1
|
|
|
|
|
case []float32 : idxT,idxC = idxCValueTypeFloat32,2
|
|
|
|
|
case func()float32 : idxT,idxC = idxCValueTypeFloat32,3
|
|
|
|
|
|
|
|
|
|
case float64 : idxT,idxC = idxCValueTypeFloat64,0
|
|
|
|
|
case *float64 : idxT,idxC = idxCValueTypeFloat64,1
|
|
|
|
|
case []float64 : idxT,idxC = idxCValueTypeFloat64,2
|
|
|
|
|
case func()float64 : idxT,idxC = idxCValueTypeFloat64,3
|
|
|
|
|
|
|
|
|
|
case complex64 : idxT,idxC = idxCValueTypeComplex64,0
|
|
|
|
|
case *complex64 : idxT,idxC = idxCValueTypeComplex64,1
|
|
|
|
|
case []complex64 : idxT,idxC = idxCValueTypeComplex64,2
|
|
|
|
|
case func()complex64: idxT,idxC = idxCValueTypeComplex64,3
|
|
|
|
|
case complex128 : idxT,idxC = idxCValueTypeComplex128,0
|
|
|
|
|
case *complex128 : idxT,idxC = idxCValueTypeComplex128,1
|
|
|
|
|
case []complex128 : idxT,idxC = idxCValueTypeComplex128,2
|
|
|
|
|
case func()complex128:idxT,idxC = idxCValueTypeComplex128,3
|
|
|
|
|
|
|
|
|
|
case time.Duration : idxT,idxC = idxCValueTypeDuration,0
|
|
|
|
|
case *time.Duration : idxT,idxC = idxCValueTypeDuration,1
|
|
|
|
|
case []time.Duration : idxT,idxC = idxCValueTypeDuration,2
|
|
|
|
|
case func()time.Duration: idxT,idxC = idxCValueTypeDuration,3
|
|
|
|
|
|
|
|
|
|
case time.Time : idxT,idxC = idxCValueTypeDate,0
|
|
|
|
|
case *time.Time : idxT,idxC = idxCValueTypeDate,1
|
|
|
|
|
case []time.Time : idxT,idxC = idxCValueTypeDate,2
|
|
|
|
|
case func()time.Time : idxT,idxC = idxCValueTypeDate,3
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
//case []uint8 : idxT,idxC = idxCValueTypeBytes,0
|
|
|
|
|
case *[]uint8 : idxT,idxC = idxCValueTypeBytes,1
|
|
|
|
|
case [][]uint8 : idxT,idxC = idxCValueTypeBytes,2
|
|
|
|
|
case func()[]uint8 : idxT,idxC = idxCValueTypeBytes,3
|
|
|
|
|
|
|
|
|
|
case excs.Stack : idxT,idxC = idxCValueTypeStack,0
|
|
|
|
|
case *excs.Stack : idxT,idxC = idxCValueTypeStack,1
|
|
|
|
|
case []excs.Stack : idxT,idxC = idxCValueTypeStack,2
|
|
|
|
|
case func()excs.Stack: idxT,idxC = idxCValueTypeStack,3
|
|
|
|
|
|
|
|
|
|
case blrs.Baleable : idxT,idxC = idxCValueTypeBaleable,0
|
|
|
|
|
case *blrs.Baleable : idxT,idxC = idxCValueTypeBaleable,1
|
|
|
|
|
case []blrs.Baleable: idxT,idxC = idxCValueTypeBaleable,2
|
|
|
|
|
case func()blrs.Baleable : idxT,idxC = idxCValueTypeBaleable,3
|
|
|
|
|
|
|
|
|
|
case error : idxT,idxC = idxCValueTypeError,0
|
|
|
|
|
case *error : idxT,idxC = idxCValueTypeError,1
|
|
|
|
|
case []error : idxT,idxC = idxCValueTypeError,2
|
|
|
|
|
case func()error : idxT,idxC = idxCValueTypeError,3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// --- CATEGORÍA 0: VALORES DIRECTOS (idxC = 0) ---
|
|
|
|
|
// Ordenados por frecuencia: string, int, bool, int64, float64, otros numéricos, tiempo, complejos, custom
|
|
|
|
|
case string : idxT, idxC = idxCValueTypeString, 0
|
|
|
|
|
@ -237,80 +121,57 @@ func CreateCValue (value any) CValue {
|
|
|
|
|
case []int16 : idxT, idxC = idxCValueTypeInt16, 2
|
|
|
|
|
case []int32 : idxT, idxC = idxCValueTypeInt32, 2
|
|
|
|
|
case []uint : idxT, idxC = idxCValueTypeUint, 2
|
|
|
|
|
case []uint16 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint16, 2
|
|
|
|
|
case []uint32 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint32, 2
|
|
|
|
|
case []uint64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint64, 2
|
|
|
|
|
case []float32 :
|
|
|
|
|
idxT, idxC = idxCValueTypeFloat32, 2
|
|
|
|
|
case []time.Time :
|
|
|
|
|
idxT, idxC = idxCValueTypeDate, 2
|
|
|
|
|
case []time.Duration:
|
|
|
|
|
idxT, idxC = idxCValueTypeDuration, 2
|
|
|
|
|
case []complex64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeComplex64, 2
|
|
|
|
|
case []complex128 :
|
|
|
|
|
idxT, idxC = idxCValueTypeComplex128, 2
|
|
|
|
|
case []excs.Stack :
|
|
|
|
|
idxT, idxC = idxCValueTypeStack, 2
|
|
|
|
|
case []blrs.Baleable:
|
|
|
|
|
idxT, idxC = idxCValueTypeBaleable, 2
|
|
|
|
|
case []error :
|
|
|
|
|
idxT, idxC = idxCValueTypeError, 2
|
|
|
|
|
case []uint16 : idxT, idxC = idxCValueTypeUint16, 2
|
|
|
|
|
case []uint32 : idxT, idxC = idxCValueTypeUint32, 2
|
|
|
|
|
case []uint64 : idxT, idxC = idxCValueTypeUint64, 2
|
|
|
|
|
case []float32 : idxT, idxC = idxCValueTypeFloat32, 2
|
|
|
|
|
case []time.Time: idxT, idxC = idxCValueTypeDate, 2
|
|
|
|
|
case []time.Duration: idxT, idxC = idxCValueTypeDuration, 2
|
|
|
|
|
case []complex64 : idxT, idxC = idxCValueTypeComplex64, 2
|
|
|
|
|
case []complex128 : idxT, idxC = idxCValueTypeComplex128, 2
|
|
|
|
|
case []excs.Stack : idxT, idxC = idxCValueTypeStack, 2
|
|
|
|
|
case []blrs.Baleable: idxT, idxC = idxCValueTypeBaleable, 2
|
|
|
|
|
case []error : idxT, idxC = idxCValueTypeError, 2
|
|
|
|
|
|
|
|
|
|
// --- CATEGORÍA 3: FUNCIONES (idxC = 3) ---
|
|
|
|
|
// Ordenados por frecuencia de su tipo de retorno: func()string, func()int, func()bool, etc.
|
|
|
|
|
case func() string :
|
|
|
|
|
idxT, idxC = idxCValueTypeString, 3
|
|
|
|
|
case func() int :
|
|
|
|
|
idxT, idxC = idxCValueTypeInt, 3
|
|
|
|
|
case func() bool :
|
|
|
|
|
idxT, idxC = idxCValueTypeBool, 3
|
|
|
|
|
case func() []uint8 : // func() []byte
|
|
|
|
|
idxT, idxC = idxCValueTypeBytes, 3
|
|
|
|
|
case func() int64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeInt64, 3
|
|
|
|
|
case func() float64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeFloat64, 3
|
|
|
|
|
case func() int8 :
|
|
|
|
|
idxT, idxC = idxCValueTypeInt8, 3
|
|
|
|
|
case func() int16 :
|
|
|
|
|
idxT, idxC = idxCValueTypeInt16, 3
|
|
|
|
|
case func() int32 :
|
|
|
|
|
idxT, idxC = idxCValueTypeInt32, 3
|
|
|
|
|
case func() uint :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint, 3
|
|
|
|
|
case func() uint8 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint8, 3
|
|
|
|
|
case func() uint16 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint16, 3
|
|
|
|
|
case func() uint32 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint32, 3
|
|
|
|
|
case func() uint64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeUint64, 3
|
|
|
|
|
case func() float32 :
|
|
|
|
|
idxT, idxC = idxCValueTypeFloat32, 3
|
|
|
|
|
case func() time.Duration:
|
|
|
|
|
idxT, idxC = idxCValueTypeDuration, 3
|
|
|
|
|
case func() time.Time :
|
|
|
|
|
idxT, idxC = idxCValueTypeDate, 3
|
|
|
|
|
case func() complex64 :
|
|
|
|
|
idxT, idxC = idxCValueTypeComplex64, 3
|
|
|
|
|
case func() complex128 :
|
|
|
|
|
idxT, idxC = idxCValueTypeComplex128, 3
|
|
|
|
|
case func() excs.Stack :
|
|
|
|
|
idxT, idxC = idxCValueTypeStack, 3
|
|
|
|
|
case func() blrs.Baleable:
|
|
|
|
|
idxT, idxC = idxCValueTypeBaleable, 3
|
|
|
|
|
|
|
|
|
|
case func() error :
|
|
|
|
|
idxT, idxC = idxCValueTypeError, 3
|
|
|
|
|
case func() string : idxT, idxC = idxCValueTypeString, 3
|
|
|
|
|
case func() int : idxT, idxC = idxCValueTypeInt, 3
|
|
|
|
|
case func() bool : idxT, idxC = idxCValueTypeBool, 3
|
|
|
|
|
case func() []uint8 : idxT, idxC = idxCValueTypeBytes, 3
|
|
|
|
|
case func() int64 : idxT, idxC = idxCValueTypeInt64, 3
|
|
|
|
|
case func() float64 : idxT, idxC = idxCValueTypeFloat64, 3
|
|
|
|
|
case func() int8 : idxT, idxC = idxCValueTypeInt8, 3
|
|
|
|
|
case func() int16 : idxT, idxC = idxCValueTypeInt16, 3
|
|
|
|
|
case func() int32 : idxT, idxC = idxCValueTypeInt32, 3
|
|
|
|
|
case func() uint : idxT, idxC = idxCValueTypeUint, 3
|
|
|
|
|
case func() uint8 : idxT, idxC = idxCValueTypeUint8, 3
|
|
|
|
|
case func() uint16 : idxT, idxC = idxCValueTypeUint16, 3
|
|
|
|
|
case func() uint32 : idxT, idxC = idxCValueTypeUint32, 3
|
|
|
|
|
case func() uint64 : idxT, idxC = idxCValueTypeUint64, 3
|
|
|
|
|
case func() float32 : idxT, idxC = idxCValueTypeFloat32, 3
|
|
|
|
|
case func() time.Duration: idxT, idxC = idxCValueTypeDuration, 3
|
|
|
|
|
case func() time.Time : idxT, idxC = idxCValueTypeDate, 3
|
|
|
|
|
case func() complex64 : idxT, idxC = idxCValueTypeComplex64, 3
|
|
|
|
|
case func() complex128 : idxT, idxC = idxCValueTypeComplex128, 3
|
|
|
|
|
case func() excs.Stack : idxT, idxC = idxCValueTypeStack, 3
|
|
|
|
|
case func() blrs.Baleable: idxT, idxC = idxCValueTypeBaleable, 3
|
|
|
|
|
|
|
|
|
|
case func() error : idxT, idxC = idxCValueTypeError, 3
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
|
|
return createCValueByReflect(value,cValueTypeCompositeMask|cValueTypeBaseMask)
|
|
|
|
|
rvalue := reflect.ValueOf(value)
|
|
|
|
|
if !rvalue.IsValid() {
|
|
|
|
|
return CValue{mType: CValueTypeInvalid, mState: cValueStateError | cValueStateNil } // O createCValueInvalid(nil) si nil no es aceptable
|
|
|
|
|
}
|
|
|
|
|
switch rvalue.Kind() {
|
|
|
|
|
case reflect.Slice,reflect.Array: return createCValueListByReflected(value,rvalue)
|
|
|
|
|
case reflect.Map: return createCValueMapByReflected(value,rvalue)
|
|
|
|
|
case reflect.Struct: return createCValueObjectByReflected(value,rvalue)
|
|
|
|
|
default:
|
|
|
|
|
return CValue{ mType: CValueTypeAny, mState: cValueStateReflected, anyVal: rvalue}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
switch idxC {
|
|
|
|
|
@ -460,7 +321,7 @@ func CreateCValueDate(value time.Time) CValue {
|
|
|
|
|
return CValue{mType: valType, mState: cValueStateZero}
|
|
|
|
|
}
|
|
|
|
|
if value.After(g.minTime) && value.Before(g.maxTime) {
|
|
|
|
|
return CValue{mType: valType, mState: cValueStateVersion,intVal: int64(value.UnixNano()), anyVal: value.Location()}
|
|
|
|
|
return CValue{mType: valType, mState: cValueStateVersion,intVal: value.UnixNano(), anyVal: value.Location()}
|
|
|
|
|
}
|
|
|
|
|
return CValue{mType: valType, anyVal: value}
|
|
|
|
|
}
|
|
|
|
|
@ -514,141 +375,482 @@ func CreateCValueError(value error) CValue {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func CreateCValueNil (value any) CValue {
|
|
|
|
|
func CreateCValueNil (_ any) CValue {
|
|
|
|
|
return CValue{mType: CValueTypeNil, mState: cValueStateNil }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func CreateCValueObject(value any) CValue { return createCValueByReflect(value,CValueTypeObject)}
|
|
|
|
|
func CreateCValueObject(value any) CValue {
|
|
|
|
|
rvalue := reflect.ValueOf(value)
|
|
|
|
|
if !rvalue.IsValid() {
|
|
|
|
|
return CValue{mType: CValueTypeInvalid, mState: cValueStateError | cValueStateNil } // O createCValueInvalid(nil) si nil no es aceptable
|
|
|
|
|
}
|
|
|
|
|
if rvalue.Kind() != reflect.Struct {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de mapa esperado
|
|
|
|
|
}
|
|
|
|
|
return createCValueObjectByReflected(value,reflect.ValueOf(value))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateCValueMap (value any) CValue {
|
|
|
|
|
return createCValueByReflect(value,CValueTypeMap)
|
|
|
|
|
rvalue := reflect.ValueOf(value)
|
|
|
|
|
if !rvalue.IsValid() {
|
|
|
|
|
return CValue{mType: CValueTypeInvalid, mState: cValueStateError | cValueStateNil } // O createCValueInvalid(nil) si nil no es aceptable
|
|
|
|
|
}
|
|
|
|
|
if rvalue.Kind() != reflect.Map {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de lista esperado
|
|
|
|
|
}
|
|
|
|
|
return createCValueMapByReflected(value,rvalue)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateCValueList(value any) CValue {
|
|
|
|
|
return createCValueByReflect(value,CValueTypeList)
|
|
|
|
|
rvalue := reflect.ValueOf(value)
|
|
|
|
|
if !rvalue.IsValid() {
|
|
|
|
|
return CValue{mType: CValueTypeInvalid, mState: cValueStateError | cValueStateNil }
|
|
|
|
|
}
|
|
|
|
|
if rvalue.Kind() != reflect.Slice && rvalue.Kind() != reflect.Array {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de lista esperado
|
|
|
|
|
}
|
|
|
|
|
return createCValueListByReflected(value,rvalue)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func createCValueInvalid(value any) CValue {
|
|
|
|
|
return CValue{ mType: CValueTypeInvalid, anyVal: value }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func createCValueByReflect(value any, expected CValueType) CValue {
|
|
|
|
|
rv := reflect.ValueOf(value)
|
|
|
|
|
if !rv.IsValid() {
|
|
|
|
|
return CValue{mType: CValueTypeInvalid, mState: cValueStateError | cValueStateNil } // O createCValueInvalid(nil) si nil no es aceptable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) Type () CValueType { return v.mType }
|
|
|
|
|
|
|
|
|
|
func (v CValue) State() CValueState { return v.mState }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) Value() (any,bool) {
|
|
|
|
|
if v.mType == CValueTypeInvalid {
|
|
|
|
|
return nil,false
|
|
|
|
|
}
|
|
|
|
|
tv := rv.Type()
|
|
|
|
|
switch v.mType.BaseType() {
|
|
|
|
|
case CValueTypeAny : return v.AsAny ()
|
|
|
|
|
case CValueTypeBool : return v.AsBool ()
|
|
|
|
|
case CValueTypeInt : return v.AsInt ()
|
|
|
|
|
case CValueTypeInt8 : return v.AsInt8 ()
|
|
|
|
|
case CValueTypeInt16 : return v.AsInt16 ()
|
|
|
|
|
case CValueTypeInt32 : return v.AsInt32 ()
|
|
|
|
|
case CValueTypeInt64 : return v.AsInt64 ()
|
|
|
|
|
case CValueTypeUint : return v.AsUint ()
|
|
|
|
|
case CValueTypeUint8 : return v.AsUint8 ()
|
|
|
|
|
case CValueTypeUint16 : return v.AsUint16 ()
|
|
|
|
|
case CValueTypeUint32 : return v.AsUint32 ()
|
|
|
|
|
case CValueTypeUint64 : return v.AsUint64 ()
|
|
|
|
|
case CValueTypeUintptr : return v.AsUintptr ()
|
|
|
|
|
case CValueTypeFloat32 : return v.AsFloat32 ()
|
|
|
|
|
case CValueTypeFloat64 : return v.AsFloat64 ()
|
|
|
|
|
case CValueTypeComplex64 : return v.AsComplex64 ()
|
|
|
|
|
case CValueTypeComplex128: return v.AsComplex128 ()
|
|
|
|
|
case CValueTypeDuration : return v.AsDuration ()
|
|
|
|
|
case CValueTypeDate : return v.AsDate ()
|
|
|
|
|
case CValueTypeString : return v.AsString ()
|
|
|
|
|
case CValueTypeBytes : return v.AsBytes ()
|
|
|
|
|
case CValueTypeStack : return v.AsStack ()
|
|
|
|
|
case CValueTypeBaleable : return v.AsBaleable ()
|
|
|
|
|
case CValueTypeError : return v.AsError ()
|
|
|
|
|
case CValueTypeNil : return nil,true
|
|
|
|
|
case CValueTypeObject : return v.AsObject ()
|
|
|
|
|
|
|
|
|
|
switch rv.Kind() {
|
|
|
|
|
case reflect.Slice,
|
|
|
|
|
reflect.Array:
|
|
|
|
|
if !expected.IsList() {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de lista esperado
|
|
|
|
|
}
|
|
|
|
|
eleType := tv.Elem()
|
|
|
|
|
zeroEle := reflect.Zero(eleType)
|
|
|
|
|
baseEleType := reflectToCValueType(zeroEle, eleType)
|
|
|
|
|
finalListCType := CValueTypeList | baseEleType
|
|
|
|
|
|
|
|
|
|
var vState CValueState
|
|
|
|
|
if rv.IsNil() { // Aunque Kind sea Slice, el slice subyacente puede ser nil
|
|
|
|
|
vState = cValueStateNil
|
|
|
|
|
return CValue{mType: finalListCType, mState: vState}
|
|
|
|
|
default:
|
|
|
|
|
if v.mType.IsList() {
|
|
|
|
|
return v.AsList()
|
|
|
|
|
}
|
|
|
|
|
if rv.Len() == 0 {
|
|
|
|
|
vState = cValueStateZero
|
|
|
|
|
return CValue{mType: finalListCType, mState: vState, anyVal: value} // Guardamos el slice vacío
|
|
|
|
|
if v.mType.IsMap() {
|
|
|
|
|
return v.AsMap()
|
|
|
|
|
}
|
|
|
|
|
vState = cValueStateReflected
|
|
|
|
|
return CValue{mType: finalListCType, mState: vState, anyVal: value}
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case reflect.Map:
|
|
|
|
|
if !expected.IsMap() {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de mapa esperado
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
keyType := tv.Key()
|
|
|
|
|
valueType := tv.Elem()
|
|
|
|
|
|
|
|
|
|
zeroKey := reflect.Zero(keyType)
|
|
|
|
|
zeroValue := reflect.Zero(valueType)
|
|
|
|
|
func (v CValue) AsAny () (any,bool){
|
|
|
|
|
if v.mType != CValueTypeAny {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal, true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsBool () (bool,bool){
|
|
|
|
|
if v.mType != CValueTypeBool {
|
|
|
|
|
return false,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return false,true
|
|
|
|
|
}
|
|
|
|
|
return v.intVal != 0,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mapType := buildMapType(reflectToCValueType(zeroKey, keyType), reflectToCValueType(zeroValue, valueType))
|
|
|
|
|
func (v CValue) AsInt () (int,bool){
|
|
|
|
|
if v.mType != CValueTypeInt {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return int(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var vState CValueState
|
|
|
|
|
if rv.IsNil() {
|
|
|
|
|
vState = cValueStateNil
|
|
|
|
|
return CValue{mType: mapType, mState: vState}
|
|
|
|
|
}
|
|
|
|
|
if rv.Len() == 0 {
|
|
|
|
|
vState = cValueStateZero
|
|
|
|
|
return CValue{mType: mapType, mState: vState, anyVal: value}
|
|
|
|
|
}
|
|
|
|
|
vState = cValueStateReflected
|
|
|
|
|
return CValue{mType: mapType, mState: vState, anyVal: rv}
|
|
|
|
|
func (v CValue) AsInt8 () (int8,bool){
|
|
|
|
|
if v.mType != CValueTypeInt8 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return int8(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case reflect.Struct:
|
|
|
|
|
if CValueTypeObject & expected == 0 {
|
|
|
|
|
return createCValueInvalid(value) // No es el tipo de mapa esperado
|
|
|
|
|
}
|
|
|
|
|
return CValue{mType: CValueTypeObject, mState: cValueStateReflected, anyVal: rv}
|
|
|
|
|
func (v CValue) AsInt16 () (int16,bool){
|
|
|
|
|
if v.mType != CValueTypeInt16 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return int16(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
// Si el Kind no es Slice, Array, Object, o Map, y no se espera que esta función
|
|
|
|
|
// maneje otros tipos que no sean Slice, Array, Object y Map debera devolver CValueObjectAny
|
|
|
|
|
// con el estado reflejado
|
|
|
|
|
return CValue{ mType: CValueTypeAny, mState: cValueStateReflected,anyVal: rv}
|
|
|
|
|
func (v CValue) AsInt32 () (int32,bool){
|
|
|
|
|
if v.mType != CValueTypeInt32 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return int32(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsInt64 () (any,bool){
|
|
|
|
|
if v.mType != CValueTypeInt64 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return v.intVal,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUint () (uint,bool){
|
|
|
|
|
if v.mType != CValueTypeUint {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uint(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUint8 () (uint8,bool){
|
|
|
|
|
if v.mType != CValueTypeUint8 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uint8(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUint16 () (uint16,bool){
|
|
|
|
|
if v.mType != CValueTypeUint16 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uint16(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUint32 () (uint32,bool){
|
|
|
|
|
if v.mType != CValueTypeUint32 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uint32(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUint64 () (uint64,bool){
|
|
|
|
|
if v.mType != CValueTypeUint64 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uint64(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsUintptr() (uintptr,bool){
|
|
|
|
|
if v.mType != CValueTypeUintptr {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return uintptr(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsFloat32() (float32,bool){
|
|
|
|
|
if v.mType != CValueTypeFloat32 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return math.Float32frombits(uint32(v.intVal)), true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsFloat64() (float64,bool){
|
|
|
|
|
if v.mType != CValueTypeFloat64 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return math.Float64frombits(uint64(v.intVal)), true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsComplex64 () (complex64,bool){
|
|
|
|
|
if v.mType != CValueTypeComplex64 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(complex64),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsComplex128() (complex128,bool){
|
|
|
|
|
if v.mType != CValueTypeComplex128 {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(complex128),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsDuration() (time.Duration,bool){
|
|
|
|
|
if v.mType != CValueTypeDuration {
|
|
|
|
|
return 0,false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return 0,true
|
|
|
|
|
}
|
|
|
|
|
return time.Duration(v.intVal),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsDate () (time.Time,bool){
|
|
|
|
|
if v.mType != CValueTypeDate {
|
|
|
|
|
return time.Time{},false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return time.Time{}, true
|
|
|
|
|
}
|
|
|
|
|
if v.State().isVersion() {
|
|
|
|
|
// version corta del date
|
|
|
|
|
return time.Unix(0, v.intVal).In(v.anyVal.(*time.Location)), true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(time.Time),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsString () (string,bool){
|
|
|
|
|
if v.mType != CValueTypeString {
|
|
|
|
|
return "", false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNilOrZero() {
|
|
|
|
|
return "", true
|
|
|
|
|
}
|
|
|
|
|
return v.strVal,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsBytes () ([]byte,bool){
|
|
|
|
|
if v.mType != CValueTypeBytes {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return []byte(nil),true
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsZero() {
|
|
|
|
|
return []byte{}, true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.([]byte),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsStack () (excs.Stack,bool){
|
|
|
|
|
if v.mType != CValueTypeStack {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return excs.Stack(nil),true
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsZero() {
|
|
|
|
|
return excs.Stack{}, true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(excs.Stack),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsBaleable() (blrs.Baleable,bool){
|
|
|
|
|
if v.mType != CValueTypeBaleable {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return blrs.Baleable(nil),true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(blrs.Baleable),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsError () (error,bool){
|
|
|
|
|
if v.mType != CValueTypeError {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return error(nil),true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(error),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsObject () (any,bool) {
|
|
|
|
|
if v.mType != CValueTypeObject {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsList () (any,bool) {
|
|
|
|
|
if v.mType != CValueTypeList {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return any(nil),true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsMap () (any,bool) {
|
|
|
|
|
if v.mType != CValueTypeMap {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
if v.State().IsNil() {
|
|
|
|
|
return nil,true
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal,true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (v CValue) AsReflected () (reflect.Value,bool) {
|
|
|
|
|
if !v.State().IsNil() {
|
|
|
|
|
return reflect.Value{},false
|
|
|
|
|
}
|
|
|
|
|
return v.anyVal.(reflect.Value),true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func createCValueListByReflected (value any, rvalue reflect.Value) CValue {
|
|
|
|
|
// asumimos que rvalue es valido y que es una slice ya que la llamada
|
|
|
|
|
// se ha hecho o bien a traves de CreateCValue o CreateCValueList
|
|
|
|
|
|
|
|
|
|
eleType := rvalue.Type().Elem()
|
|
|
|
|
zeroEle := reflect.Zero(eleType)
|
|
|
|
|
baseEleType := reflectToCValueType(zeroEle, eleType)
|
|
|
|
|
finalListCType := CValueTypeList | baseEleType
|
|
|
|
|
|
|
|
|
|
var vState CValueState
|
|
|
|
|
if rvalue.IsNil() { // Aunque Kind sea Slice, el slice subyacente puede ser nil
|
|
|
|
|
vState = cValueStateNil
|
|
|
|
|
return CValue{mType: finalListCType, mState: vState}
|
|
|
|
|
}
|
|
|
|
|
vState = cValueStateReflected
|
|
|
|
|
if rvalue.Len() == 0 {
|
|
|
|
|
vState |= cValueStateZero
|
|
|
|
|
}
|
|
|
|
|
return CValue{mType: finalListCType, mState: vState, anyVal: rvalue}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createCValueMapByReflected (value any, rvalue reflect.Value) CValue {
|
|
|
|
|
// asumimos que rvalue es valido y que es un map ya que la llamada
|
|
|
|
|
// se ha hecho o bien a traves de CreateCValue o CreateCValueMap
|
|
|
|
|
|
|
|
|
|
tv := rvalue.Type()
|
|
|
|
|
kType := tv.Key()
|
|
|
|
|
vType := tv.Elem()
|
|
|
|
|
|
|
|
|
|
zeroKey := reflect.Zero(kType)
|
|
|
|
|
zeroValue := reflect.Zero(vType)
|
|
|
|
|
|
|
|
|
|
mType := buildMapType(reflectToCValueType(zeroKey, kType), reflectToCValueType(zeroValue, vType))
|
|
|
|
|
|
|
|
|
|
var vState CValueState
|
|
|
|
|
if rvalue.IsNil() {
|
|
|
|
|
vState = cValueStateNil
|
|
|
|
|
return CValue{mType: mType, mState: vState}
|
|
|
|
|
}
|
|
|
|
|
vState = cValueStateReflected
|
|
|
|
|
if rvalue.Len() == 0 {
|
|
|
|
|
vState |= cValueStateZero
|
|
|
|
|
}
|
|
|
|
|
return CValue{mType: mType, mState: vState, anyVal: rvalue}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createCValueObjectByReflected (value any, rvalue reflect.Value) CValue {
|
|
|
|
|
// asumimos que rvalue es valido y que es un struct ya que la llamada
|
|
|
|
|
// se ha hecho o bien a traves de CreateCValue o CreateCValueMap
|
|
|
|
|
return CValue{mType: CValueTypeObject, mState: cValueStateReflected, anyVal: rvalue}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// reflectToCValueType determina el CValueType base para un reflect.Value y reflect.Type dados.
|
|
|
|
|
func reflectToCValueType(rv reflect.Value, tp reflect.Type) CValueType {
|
|
|
|
|
// Primero, intentar identificar por el valor concreto usando un type switch.
|
|
|
|
|
// Esto es más eficiente para tipos conocidos que no son interfaces puras.
|
|
|
|
|
// rv.Interface() puede causar pánico si rv es un valor cero de un tipo no exportado
|
|
|
|
|
// o si rv no es válido. Asegurarse de que rv sea válido antes de llamar a Interface().
|
|
|
|
|
if rv.IsValid() { // Añadir chequeo de validez
|
|
|
|
|
// Priorizar la identificación por el valor concreto para tipos conocidos y válidos.
|
|
|
|
|
if rv.IsValid() {
|
|
|
|
|
switch rv.Interface().(type) {
|
|
|
|
|
case time.Time: return CValueTypeDate
|
|
|
|
|
case time.Duration: return CValueTypeDuration
|
|
|
|
|
case excs.Stack: return CValueTypeStack
|
|
|
|
|
case []byte: return CValueTypeBytes
|
|
|
|
|
case blrs.Baleable: return CValueTypeBaleable
|
|
|
|
|
case error: return CValueTypeError
|
|
|
|
|
case time.Time: return CValueTypeDate
|
|
|
|
|
case time.Duration: return CValueTypeDuration
|
|
|
|
|
case excs.Stack: return CValueTypeStack
|
|
|
|
|
case []byte: return CValueTypeBytes
|
|
|
|
|
case blrs.Baleable: return CValueTypeBaleable
|
|
|
|
|
case error: return CValueTypeError
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if tp != nil {
|
|
|
|
|
typeError := reflect.TypeOf((*error)(nil)).Elem()
|
|
|
|
|
typeBaleable := reflect.TypeOf((*blrs.Baleable)(nil)).Elem()
|
|
|
|
|
|
|
|
|
|
if tp.Implements(typeError) {
|
|
|
|
|
return CValueTypeError
|
|
|
|
|
}
|
|
|
|
|
if tp.Implements(typeBaleable) {
|
|
|
|
|
return CValueTypeBaleable
|
|
|
|
|
}
|
|
|
|
|
// Si tp es nil, no hay información de tipo para determinar.
|
|
|
|
|
if tp == nil {
|
|
|
|
|
return CValueTypeInvalid
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprobación para tipos concretos especiales por reflect.Type
|
|
|
|
|
if tp == reflect.TypeOf(time.Time{}) {
|
|
|
|
|
return CValueTypeDate
|
|
|
|
|
}
|
|
|
|
|
if tp == reflect.TypeOf(time.Duration(0)) {
|
|
|
|
|
return CValueTypeDuration
|
|
|
|
|
}
|
|
|
|
|
if tp == reflect.TypeOf([]byte{}) {
|
|
|
|
|
return CValueTypeBytes
|
|
|
|
|
}
|
|
|
|
|
if tp == reflect.TypeOf(excs.Stack{}) { // Si Stack es un tipo específico
|
|
|
|
|
return CValueTypeStack
|
|
|
|
|
}
|
|
|
|
|
return kindToCValueType(tp.Kind(),false)
|
|
|
|
|
// Identificar tipos que implementan interfaces específicas.
|
|
|
|
|
if tp.Implements(reflect.TypeOf((*error)(nil)).Elem()) {
|
|
|
|
|
return CValueTypeError
|
|
|
|
|
}
|
|
|
|
|
return CValueTypeInvalid // Si tp es nil
|
|
|
|
|
if tp.Implements(reflect.TypeOf((*blrs.Baleable)(nil)).Elem()) {
|
|
|
|
|
return CValueTypeBaleable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Como último recurso, mapear el Kind del tipo a un CValueType.
|
|
|
|
|
// kindToCValueType debe ser robusto y manejar correctamente
|
|
|
|
|
// todos los reflect.Kind relevantes (ej., Struct -> Object, Slice/Array -> List).
|
|
|
|
|
return kindToCValueType(tp.Kind(), false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -694,3 +896,12 @@ func kindToCValueType(kind reflect.Kind, base bool) CValueType {
|
|
|
|
|
return CValueTypeAny
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|