@@ -15,6 +15,7 @@ import (
1515 "time"
1616)
1717
18+ // Converter is used to provide custom mappers for a datatype pair.
1819type Converter func (in reflect.Value ) (reflect.Value , error )
1920
2021const (
4546 NoTraverseTypeList map [reflect.Type ]bool
4647
4748 // Type conversion functions at library level
48- MapTypList map [reflect.Type ]map [reflect.Type ]Converter
49+ converterMap map [reflect.Type ]map [reflect.Type ]Converter
4950
5051 typeOfBytes = reflect .TypeOf ([]byte (nil ))
5152 typeOfInterface = reflect .TypeOf ((* interface {})(nil )).Elem ()
@@ -77,39 +78,34 @@ func extractType(x interface{}) reflect.Type {
7778 return reflect .TypeOf (x ).Elem ()
7879}
7980
80- // TODO
81- // Register a converter form UUID to string:
82- // model.AddConversion((*UUID)(nil), (*string)(nil), converter)
83- // Register a converter from *UUID to string:
84- // model.AddConversion((**UUID)(nil), (*string)(nil), converter)
85- // TODO
81+ // AddConversion mothod allows registering a custom `Converter` into the global `converterMap`.
8682func AddConversion (in interface {}, out interface {}, converter Converter ) {
8783 srcType := extractType (in )
8884 targetType := extractType (out )
89- if _ , ok := MapTypList [srcType ]; ! ok {
90- MapTypList [srcType ] = map [reflect.Type ]Converter {}
85+ if _ , ok := converterMap [srcType ]; ! ok {
86+ converterMap [srcType ] = map [reflect.Type ]Converter {}
9187 }
92- MapTypList [srcType ][targetType ] = converter
88+ converterMap [srcType ][targetType ] = converter
9389}
9490
9591// Remove registered conversions
9692func RemoveConversion (in interface {}, out interface {}) {
9793 srcType := extractType (in )
9894 targetType := extractType (out )
99- if _ , ok := MapTypList [srcType ]; ! ok {
95+ if _ , ok := converterMap [srcType ]; ! ok {
10096 return
10197 }
102- if _ , ok := MapTypList [srcType ][targetType ]; ! ok {
98+ if _ , ok := converterMap [srcType ][targetType ]; ! ok {
10399 return
104100 }
105- delete (MapTypList [srcType ], targetType )
101+ delete (converterMap [srcType ], targetType )
106102}
107103
108104func conversionExists (srcType reflect.Type , destType reflect.Type ) bool {
109- if _ , ok := MapTypList [srcType ]; ! ok {
105+ if _ , ok := converterMap [srcType ]; ! ok {
110106 return false
111107 }
112- if _ , ok := MapTypList [srcType ][destType ]; ! ok {
108+ if _ , ok := converterMap [srcType ][destType ]; ! ok {
113109 return false
114110 }
115111 return true
@@ -597,7 +593,7 @@ func Kind(s interface{}, name string) (reflect.Kind, error) {
597593
598594func init () {
599595 NoTraverseTypeList = map [reflect.Type ]bool {}
600- MapTypList = map [reflect.Type ]map [reflect.Type ]Converter {}
596+ converterMap = map [reflect.Type ]map [reflect.Type ]Converter {}
601597
602598 // Default NoTraverseTypeList
603599 // --------------------------
@@ -672,15 +668,16 @@ func doCopy(dv, sv reflect.Value) []error {
672668 // check dst field settable or not
673669 if dfv .CanSet () {
674670
675- // handle embedded or nested struct
676671 if conversionExists (sfv .Type (), dfv .Type ()) {
677- res , err := MapTypList [sfv .Type ()][dfv .Type ()](sfv )
672+ // handle custom converters
673+ res , err := converterMap [sfv .Type ()][dfv .Type ()](sfv )
678674 if err != nil {
679675 errs = append (errs , err )
680676 } else {
681677 dfv .Set (res )
682678 }
683679 } else if isStruct (sfv ) {
680+ // handle embedded or nested struct
684681
685682 if noTraverse {
686683 // This is struct kind and it's present in NoTraverseTypeList or
0 commit comments