v0.0.351 sq value converter
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m30s
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m30s
This commit is contained in:
@@ -4,17 +4,11 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/rfctime"
|
||||
"reflect"
|
||||
"time"
|
||||
)
|
||||
|
||||
//TODO UNFINISHED
|
||||
// this is not finished
|
||||
// idea was that we can register converter in the database struct
|
||||
// they get inherited from the transactions
|
||||
// and when marshallingunmarshaling (sq.Query | sq.QueryAll)
|
||||
// or marshaling (sq.InsertSingle)
|
||||
// the types get converter automatically...
|
||||
|
||||
type DBTypeConverter interface {
|
||||
ModelTypeString() string
|
||||
DBTypeString() string
|
||||
@@ -40,16 +34,42 @@ var ConverterTimeToUnixMillis = NewDBTypeConverter[time.Time, int64](func(v time
|
||||
return time.UnixMilli(v), nil
|
||||
})
|
||||
|
||||
var ConverterOptTimeToUnixMillis = NewDBTypeConverter[*time.Time, *int64](func(v *time.Time) (*int64, error) {
|
||||
if v == nil {
|
||||
return nil, nil
|
||||
var ConverterRFCUnixMilliTimeToUnixMillis = NewDBTypeConverter[rfctime.UnixMilliTime, int64](func(v rfctime.UnixMilliTime) (int64, error) {
|
||||
return v.UnixMilli(), nil
|
||||
}, func(v int64) (rfctime.UnixMilliTime, error) {
|
||||
return rfctime.NewUnixMilli(time.UnixMilli(v)), nil
|
||||
})
|
||||
|
||||
var ConverterRFCUnixNanoTimeToUnixNanos = NewDBTypeConverter[rfctime.UnixNanoTime, int64](func(v rfctime.UnixNanoTime) (int64, error) {
|
||||
return v.UnixNano(), nil
|
||||
}, func(v int64) (rfctime.UnixNanoTime, error) {
|
||||
return rfctime.NewUnixNano(time.Unix(0, v)), nil
|
||||
})
|
||||
|
||||
var ConverterRFCUnixTimeToUnixSeconds = NewDBTypeConverter[rfctime.UnixTime, int64](func(v rfctime.UnixTime) (int64, error) {
|
||||
return v.Unix(), nil
|
||||
}, func(v int64) (rfctime.UnixTime, error) {
|
||||
return rfctime.NewUnix(time.Unix(v, 0)), nil
|
||||
})
|
||||
|
||||
var ConverterRFC339TimeToString = NewDBTypeConverter[rfctime.RFC3339Time, string](func(v rfctime.RFC3339Time) (string, error) {
|
||||
return v.Format(time.RFC3339), nil
|
||||
}, func(v string) (rfctime.RFC3339Time, error) {
|
||||
t, err := time.Parse(time.RFC3339Nano, v)
|
||||
if err != nil {
|
||||
return rfctime.RFC3339Time{}, err
|
||||
}
|
||||
return langext.Ptr(v.UnixMilli()), nil
|
||||
}, func(v *int64) (*time.Time, error) {
|
||||
if v == nil {
|
||||
return nil, nil
|
||||
return rfctime.NewRFC3339(t), nil
|
||||
})
|
||||
|
||||
var ConverterRFC339NanoTimeToString = NewDBTypeConverter[rfctime.RFC3339NanoTime, string](func(v rfctime.RFC3339NanoTime) (string, error) {
|
||||
return v.Format(time.RFC3339Nano), nil
|
||||
}, func(v string) (rfctime.RFC3339NanoTime, error) {
|
||||
t, err := time.Parse(time.RFC3339Nano, v)
|
||||
if err != nil {
|
||||
return rfctime.RFC3339NanoTime{}, err
|
||||
}
|
||||
return langext.Ptr(time.UnixMilli(*v)), nil
|
||||
return rfctime.NewRFC3339Nano(t), nil
|
||||
})
|
||||
|
||||
type dbTypeConverterImpl[TModelData any, TDBData any] struct {
|
||||
@@ -89,3 +109,36 @@ func NewDBTypeConverter[TModelData any, TDBData any](todb func(v TModelData) (TD
|
||||
tomodel: tomodel,
|
||||
}
|
||||
}
|
||||
|
||||
func convertValueToDB(q Queryable, value any) (any, error) {
|
||||
modelTypeStr := fmt.Sprintf("%T", value)
|
||||
|
||||
for _, conv := range q.ListConverter() {
|
||||
if conv.ModelTypeString() == modelTypeStr {
|
||||
return conv.ModelToDB(value)
|
||||
}
|
||||
}
|
||||
|
||||
if value != nil && reflect.TypeOf(value).Kind() == reflect.Ptr {
|
||||
vof := reflect.ValueOf(value)
|
||||
if vof.IsNil() {
|
||||
return nil, nil
|
||||
} else {
|
||||
return convertValueToDB(q, vof.Elem().Interface())
|
||||
}
|
||||
}
|
||||
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func convertValueToModel(q Queryable, value any, destinationType string) (any, error) {
|
||||
dbTypeString := fmt.Sprintf("%T", value)
|
||||
|
||||
for _, conv := range q.ListConverter() {
|
||||
if conv.ModelTypeString() == destinationType && conv.DBTypeString() == dbTypeString {
|
||||
return conv.DBToModel(value)
|
||||
}
|
||||
}
|
||||
|
||||
return value, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user