125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
package copierutil
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/jinzhu/copier"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
|
|
"github.com/tx7do/go-utils/timeutil"
|
|
"github.com/tx7do/go-utils/trans"
|
|
)
|
|
|
|
var TimeToStringConverter = copier.TypeConverter{
|
|
SrcType: &time.Time{}, // 源类型
|
|
DstType: trans.Ptr(""), // 目标类型
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return timeutil.TimeToTimeString(src.(*time.Time)), nil
|
|
},
|
|
}
|
|
|
|
var StringToTimeConverter = copier.TypeConverter{
|
|
SrcType: trans.Ptr(""),
|
|
DstType: &time.Time{},
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return timeutil.StringTimeToTime(src.(*string)), nil
|
|
},
|
|
}
|
|
|
|
var TimeToTimestamppbConverter = copier.TypeConverter{
|
|
SrcType: &time.Time{},
|
|
DstType: ×tamppb.Timestamp{},
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return timeutil.TimeToTimestamppb(src.(*time.Time)), nil
|
|
},
|
|
}
|
|
|
|
var TimestamppbToTimeConverter = copier.TypeConverter{
|
|
SrcType: ×tamppb.Timestamp{},
|
|
DstType: &time.Time{},
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return timeutil.TimestamppbToTime(src.(*timestamppb.Timestamp)), nil
|
|
},
|
|
}
|
|
|
|
func NewTimeStringConverterPair() []copier.TypeConverter {
|
|
srcType := &time.Time{}
|
|
dstType := trans.Ptr("")
|
|
|
|
fromFn := timeutil.TimeToTimeString
|
|
toFn := timeutil.StringTimeToTime
|
|
|
|
return NewGenericTypeConverterPair(srcType, dstType, fromFn, toFn)
|
|
}
|
|
|
|
func NewTimeTimestamppbConverterPair() []copier.TypeConverter {
|
|
srcType := &time.Time{}
|
|
dstType := ×tamppb.Timestamp{}
|
|
|
|
fromFn := timeutil.TimeToTimestamppb
|
|
toFn := timeutil.TimestamppbToTime
|
|
|
|
return NewGenericTypeConverterPair(srcType, dstType, fromFn, toFn)
|
|
}
|
|
|
|
func NewTypeConverter(srcType, dstType interface{}, fn func(src interface{}) (interface{}, error)) copier.TypeConverter {
|
|
return copier.TypeConverter{
|
|
SrcType: srcType,
|
|
DstType: dstType,
|
|
Fn: fn,
|
|
}
|
|
}
|
|
|
|
func NewTypeConverterPair(srcType, dstType interface{}, fromFn, toFn func(src interface{}) (interface{}, error)) []copier.TypeConverter {
|
|
return []copier.TypeConverter{
|
|
{
|
|
SrcType: srcType,
|
|
DstType: dstType,
|
|
Fn: fromFn,
|
|
},
|
|
{
|
|
SrcType: dstType,
|
|
DstType: srcType,
|
|
Fn: toFn,
|
|
},
|
|
}
|
|
}
|
|
|
|
func NewGenericTypeConverterPair[A interface{}, B interface{}](srcType A, dstType B, fromFn func(src A) B, toFn func(src B) A) []copier.TypeConverter {
|
|
return []copier.TypeConverter{
|
|
{
|
|
SrcType: srcType,
|
|
DstType: dstType,
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return fromFn(src.(A)), nil
|
|
},
|
|
},
|
|
{
|
|
SrcType: dstType,
|
|
DstType: srcType,
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return toFn(src.(B)), nil
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func NewErrorHandlingGenericTypeConverterPair[A interface{}, B interface{}](srcType A, dstType B, fromFn func(src A) (B, error), toFn func(src B) (A, error)) []copier.TypeConverter {
|
|
return []copier.TypeConverter{
|
|
{
|
|
SrcType: srcType,
|
|
DstType: dstType,
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return fromFn(src.(A))
|
|
},
|
|
},
|
|
{
|
|
SrcType: dstType,
|
|
DstType: srcType,
|
|
Fn: func(src interface{}) (interface{}, error) {
|
|
return toFn(src.(B))
|
|
},
|
|
},
|
|
}
|
|
}
|