Files
PandaX/apps/device/tsl/convert.go
2023-09-21 18:00:33 +08:00

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 ""
}