mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
147 lines
2.6 KiB
Go
147 lines
2.6 KiB
Go
package tsl
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func (t DefineAttribute) ConvertAttributeValue(v interface{}) interface{} {
|
|
if *t.Rw == "w" {
|
|
return ""
|
|
}
|
|
if v == nil {
|
|
return t.DefaultValue
|
|
}
|
|
return v
|
|
}
|
|
|
|
func (t ValueType) ConvertValue(v interface{}) interface{} {
|
|
var transfer Transfer
|
|
switch t.Type {
|
|
case TypeInt:
|
|
transfer = TInt(t.DefineBase)
|
|
case TypeFloat:
|
|
transfer = TFloat(t.DefineBase)
|
|
case TypeString:
|
|
transfer = TText(t.DefineBase)
|
|
case TypeBool:
|
|
transfer = TBoolean(t.DefineBase)
|
|
case TypeDate:
|
|
transfer = TDate(t.DefineBase)
|
|
case TypeEnum:
|
|
transfer = TEnum(t.DefineBase)
|
|
default:
|
|
return nil
|
|
}
|
|
return transfer.Convert(v)
|
|
}
|
|
|
|
type Transfer interface {
|
|
Convert(interface{}) interface{}
|
|
}
|
|
|
|
type TInt DefineBase
|
|
|
|
func (tInt TInt) Convert(v interface{}) interface{} {
|
|
number, ok := v.(int64)
|
|
if !ok {
|
|
floatNumber, floatNumberOk := v.(float64)
|
|
if !floatNumberOk {
|
|
return 0
|
|
}
|
|
number = int64(floatNumber)
|
|
}
|
|
if tInt.Min != nil && int64(*tInt.Min) > number {
|
|
return *tInt.Min
|
|
}
|
|
if tInt.Max != nil && int64(*tInt.Max) > number {
|
|
return *tInt.Max
|
|
}
|
|
return number
|
|
}
|
|
|
|
type TFloat DefineBase
|
|
|
|
func (tFloat TFloat) Convert(v interface{}) interface{} {
|
|
number, ok := v.(float64)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
if tFloat.Min != nil && *tFloat.Min > number {
|
|
number = *tFloat.Min
|
|
}
|
|
if tFloat.Max != nil && *tFloat.Max > number {
|
|
number = *tFloat.Max
|
|
}
|
|
defaultDecimal := 2
|
|
if tFloat.Decimals != nil {
|
|
defaultDecimal = *tFloat.Decimals
|
|
}
|
|
number64, _ := strconv.ParseFloat(strconv.FormatFloat(number, 'f', defaultDecimal, 64), 32)
|
|
return number64
|
|
}
|
|
|
|
type TText DefineBase
|
|
|
|
func (tText TText) Convert(v interface{}) interface{} {
|
|
text, ok := v.(string)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
if tText.MaxLength != nil && *tText.MaxLength > 0 && len(text) > *tText.MaxLength {
|
|
return text[:*tText.MaxLength-1]
|
|
} else {
|
|
return text
|
|
}
|
|
}
|
|
|
|
type TBoolean DefineBase
|
|
|
|
func (tBoolean TBoolean) Convert(v interface{}) interface{} {
|
|
b, ok := v.(bool)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
if b {
|
|
return tBoolean.DefineBool[1].Value
|
|
} else {
|
|
return tBoolean.DefineBool[0].Value
|
|
}
|
|
return ""
|
|
}
|
|
|
|
type TDate DefineBase
|
|
|
|
const layout = "2006-01-02 15:04:05"
|
|
|
|
func (TDate TDate) Convert(v interface{}) interface{} {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return time.Time{}
|
|
}
|
|
t, err := time.Parse(layout, str)
|
|
if err != nil {
|
|
return time.Time{}
|
|
} else {
|
|
return t
|
|
}
|
|
}
|
|
|
|
type TEnum DefineBase
|
|
|
|
func (tEnum TEnum) Convert(v interface{}) interface{} {
|
|
tE, ok := v.(string)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
if tEnum.Enums == nil {
|
|
return ""
|
|
}
|
|
for _, node := range tEnum.Enums {
|
|
if node.Key == tE {
|
|
return node.Value
|
|
}
|
|
}
|
|
return ""
|
|
}
|