You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
8.5 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// ------------------------------------------------------------------------
// ℹ️ Project active3
// 🔗 Active Thing (activething.com) git.activething.com/go
//
// File name factory.go
// ✍️ Created by DEV
// 📅 Modified 01/05/2024
//
// 🔒 COPYRIGHT Copyright 2024 activething.com
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------
package aflds
import (
"reflect"
"time"
)
// Create es un método que crea y devuelve un nuevo campo con el nombre, valor y tipo especificados.
// Este método es utilizado para crear campos de diferentes tipos según el valor del tipo Kind proporcionado.
// Si el tipo Kind es KindAny, el campo se crea utilizando el valor y su tipo se infiere automáticamente.
//
// Parámetros:
// - name: El nombre del campo que se va a crear.
// - valueFn: El valor del campo que se va a asignar.
// - valuerKind: El tipo de campo que se va a crear, representado por un valor de la enumeración Kind.
// Devuelve:
// - Field: El campo creado con el nombre, valor y tipo especificados.
// Pánico:
// - Si se proporciona un tipo de Kind inválido, el método entra en un estado de pánico y devuelve un error ErrInvalidKind.
func Create (name string, value any, kind Kind) Field {
if kind == 0 {
return CreateFromValue(name,value)
}
switch kind {
case KindAny : return NewFieldAny (name,value)
case KindBool : return NewFieldBool (name,value.(bool))
case KindBinary : return NewFieldBinary(name,value.([]byte))
case KindString : return NewFieldString(name,value.(string))
case KindInt : return NewFieldInt (name,value.(int))
case KindUint : return NewFieldUint (name,value.(uint))
case KindFloat : return NewFieldFloat (name,value.(float64))
case KindTime : return NewFieldTime (name,value.(time.Time))
case KindDuration:return NewFieldDuration(name,value.(time.Duration))
case KindError : return NewFieldError (name,value.(error))
case KindReflect : return NewFieldReflect(name,value.(reflect.Value))
//valuerKind Fields
case KindDefer,
KindDeferAny : return NewDFieldAny (name,value.(func()any))
case KindDeferBool : return NewDFieldBool (name,value.(func()bool))
case KindDeferString : return NewDFieldString(name,value.(func()string))
case KindDeferBinary : return NewDFieldBinary(name,value.(func()[]byte))
case KindDeferInt : return NewDFieldInt (name,value.(func()int))
case KindDeferUint : return NewDFieldUint (name,value.(func()uint))
case KindDeferFloat : return NewDFieldFloat (name,value.(func()float64))
case KindDeferTime : return NewDFieldTime (name,value.(func()time.Time))
case KindDeferDuration:return NewDFieldDuration (name,value.(func()time.Duration))
case KindDeferError : return NewDFieldError (name,value.(func()error))
case KindDeferReflect :return NewDFieldReflect(name,value.(func()reflect.Value))
default:
panic(G.ErrInvalidKind)
}
}
// CreateFromValue es un método que crea y devuelve un nuevo campo basado en el valor proporcionado.
// Examina el tipo del valor y crea un campo correspondiente, asignando el nombre especificado.
// Si el tipo del valor no coincide con ninguno de los tipos predefinidos, se crea un campo genérico utilizando el tipo KindAny.
//
// Parámetros:
// - name: El nombre del campo que se va a crear.
// - valueFn: El valor del campo que se va a asignar.
// Devuelve:
// - Field: El campo creado con el nombre y valor especificados.
func CreateFromValue(name string, value any) Field {
switch t := value.(type) {
case bool : return NewFieldBool (name,t)
case []byte : return NewFieldBinary (name,t)
case string : return NewFieldString (name,t)
case int : return NewFieldInt (name,t)
case int8 : return NewFieldInt (name,int(t))
case int16 : return NewFieldInt (name,int(t))
case int32 : return NewFieldInt (name,int(t))
case int64 : return NewFieldInt (name,int(t))
case uint : return NewFieldUint (name,t)
case uint8 : return NewFieldUint (name,uint(t))
case uint16 : return NewFieldUint (name,uint(t))
case uint32 : return NewFieldUint (name,uint(t))
case uint64 : return NewFieldUint (name,uint(t))
case uintptr: return NewFieldUint (name,uint(t))
case float64: return NewFieldFloat(name,t)
case float32: return NewFieldFloat(name,float64(t))
case error : return NewFieldError(name,t)
case time.Time:
return NewFieldTime (name,t)
case time.Duration:
return NewFieldDuration (name,t)
case reflect.Value :
return NewFieldReflect(name,t)
case func() any : return NewDFieldAny (name,t)
case func() bool : return NewDFieldBool(name,t)
case func() []byte : return NewDFieldBinary(name,t)
case func() string : return NewDFieldString(name,t)
case func() int : return NewDFieldInt (name,t)
case func() int8 : return NewDFieldInt (name,func() int { return int(t()) })
case func() int16 : return NewDFieldInt (name,func() int { return int(t()) })
case func() int32 : return NewDFieldInt (name,func() int { return int(t()) })
case func() int64 : return NewDFieldInt (name,func() int { return int(t()) })
case func() uint : return NewDFieldUint(name,t)
case func() uint8 : return NewDFieldUint(name,func() uint { return uint(t()) })
case func() uint16 : return NewDFieldUint(name,func() uint { return uint(t()) })
case func() uint32 : return NewDFieldUint(name,func() uint { return uint(t()) })
case func() uint64 : return NewDFieldUint(name,func() uint { return uint(t()) })
case func() uintptr: return NewDFieldUint(name,func() uint { return uint(t()) })
case func() float64: return NewDFieldFloat(name,t)
case func() float32: return NewDFieldFloat(name,func() float64 { return float64(t()) })
case func() error : return NewDFieldError(name,t)
case func() time.Time :
return NewDFieldTime(name,t)
case func() time.Duration :
return NewDFieldDuration(name,t)
case func() reflect.Value :
return NewDFieldReflect(name,t)
default:
if value != nil {
rv := reflect.ValueOf(value)
if rv.Kind() == reflect.Func {
tp := rv.Type()
if tp.NumIn() == 0 && tp.NumOut() == 1 {
return NewDFieldAny(name, func() any {
return rv.Call(nil)[0].Interface()
})
}
}
}
return NewFieldAny(name,value)
}
}
// TypeToKind es una función que determina el tipo de Kind correspondiente al valor proporcionado.
// Examina el tipo del valor y devuelve un tipo Kind adecuado que representa el tipo del valor.
// Si el valor es una función, el tipo Kind resultante tendrá la bandera KindDefer para indicar que es una función deferida.
//
// Parámetros:
// - valueFn: El valor del cual se determinará el tipo Kind.
// Devuelve:
// - Kind: El tipo Kind correspondiente al valor proporcionado.
func TypeToKind(value any) Kind {
switch value.(type) {
case bool:
return KindAny
case []byte :
return KindBinary
case string :
return KindString
case int,
int8,
int16,
int32,
int64 :
return KindInt
case uint,
uint8,
uint16,
uint32,
uint64,
uintptr : return KindUint
case float64,
float32:
return KindFloat
case error :
return KindError
case time.Time:
return KindTime
case reflect.Value:
return KindReflect
case func() any :
return KindAny|KindDefer
case func() bool :
return KindBool|KindDefer
case func() []byte :
return KindBinary|KindDefer
case func() string :
return KindString|KindDefer
case func() int,
func() int8,
func() int16,
func() int32,
func() int64 :
return KindInt|KindDefer
case func() uint,
func() uint8,
func() uint16,
func() uint32,
func() uint64,
func() uintptr :
return KindInt|KindDefer
case func() float64,
func() float32 :
return KindFloat|KindDefer
case func() error :
return KindError|KindDefer
case func() time.Time:
return KindTime|KindDefer
case func() reflect.Value:
return KindReflect|KindDefer
default:
rt := reflect.TypeOf(value)
if rt.Kind() == reflect.Func && rt.NumIn() == 0 && rt.NumOut() == 1 {
return KindAny|KindDefer
}
return KindAny
}
}

Powered by TurnKey Linux.