83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
package mapper
|
|
|
|
import (
|
|
"github.com/jinzhu/copier"
|
|
)
|
|
|
|
type EnumTypeConverter[DTO ~int32, ENTITY ~string] struct {
|
|
nameMap map[int32]string
|
|
valueMap map[string]int32
|
|
}
|
|
|
|
func NewEnumTypeConverter[DTO ~int32, ENTITY ~string](
|
|
nameMap map[int32]string,
|
|
valueMap map[string]int32,
|
|
) *EnumTypeConverter[DTO, ENTITY] {
|
|
return &EnumTypeConverter[DTO, ENTITY]{
|
|
valueMap: valueMap,
|
|
nameMap: nameMap,
|
|
}
|
|
}
|
|
|
|
func (m *EnumTypeConverter[DTO, ENTITY]) ToEntity(dto *DTO) *ENTITY {
|
|
if dto == nil {
|
|
return nil
|
|
}
|
|
|
|
find, ok := m.nameMap[int32(*dto)]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
entity := ENTITY(find)
|
|
return &entity
|
|
}
|
|
|
|
func (m *EnumTypeConverter[DTO, ENTITY]) ToDTO(entity *ENTITY) *DTO {
|
|
if entity == nil {
|
|
return nil
|
|
}
|
|
|
|
find, ok := m.valueMap[string(*entity)]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
dto := DTO(find)
|
|
return &dto
|
|
}
|
|
|
|
func (m *EnumTypeConverter[DTO, ENTITY]) NewConverterPair() []copier.TypeConverter {
|
|
srcType := ENTITY("")
|
|
dstType := DTO(0)
|
|
|
|
fromFn := m.ToDTO
|
|
toFn := m.ToEntity
|
|
|
|
return NewGenericTypeConverterPair(&srcType, &dstType, fromFn, 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
|
|
},
|
|
},
|
|
}
|
|
}
|