feat: refactor type mapper.

This commit is contained in:
Bobo
2025-06-16 14:49:21 +08:00
parent a1b8326783
commit de36ab695d
6 changed files with 102 additions and 94 deletions

View File

@@ -4,19 +4,22 @@ import (
"github.com/jinzhu/copier"
)
type EnumTypeConverter[DTO ~int32, MODEL ~string] struct {
type EnumTypeConverter[DTO ~int32, ENTITY ~string] struct {
nameMap map[int32]string
valueMap map[string]int32
}
func NewEnumTypeConverter[DTO ~int32, MODEL ~string](nameMap map[int32]string, valueMap map[string]int32) *EnumTypeConverter[DTO, MODEL] {
return &EnumTypeConverter[DTO, MODEL]{
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, MODEL]) ToModel(dto *DTO) *MODEL {
func (m *EnumTypeConverter[DTO, ENTITY]) ToEntity(dto *DTO) *ENTITY {
if dto == nil {
return nil
}
@@ -26,16 +29,16 @@ func (m *EnumTypeConverter[DTO, MODEL]) ToModel(dto *DTO) *MODEL {
return nil
}
model := MODEL(find)
return &model
entity := ENTITY(find)
return &entity
}
func (m *EnumTypeConverter[DTO, MODEL]) ToDto(model *MODEL) *DTO {
if model == nil {
func (m *EnumTypeConverter[DTO, ENTITY]) ToDTO(entity *ENTITY) *DTO {
if entity == nil {
return nil
}
find, ok := m.valueMap[string(*model)]
find, ok := m.valueMap[string(*entity)]
if !ok {
return nil
}
@@ -44,17 +47,22 @@ func (m *EnumTypeConverter[DTO, MODEL]) ToDto(model *MODEL) *DTO {
return &dto
}
func (m *EnumTypeConverter[DTO, MODEL]) NewConverterPair() []copier.TypeConverter {
srcType := MODEL("")
func (m *EnumTypeConverter[DTO, ENTITY]) NewConverterPair() []copier.TypeConverter {
srcType := ENTITY("")
dstType := DTO(0)
fromFn := m.ToDto
toFn := m.ToModel
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 {
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,