github.com/urso/go-structform@v0.0.2/gotype/fold_map_inline.yml (about) 1 import: 2 - types.yml 3 4 main: | 5 package gotype 6 7 import ( 8 "reflect" 9 10 stunsafe "github.com/urso/go-structform/internal/unsafe" 11 ) 12 13 var _mapInlineMapping = map[reflect.Type]reFoldFn{ 14 {{ range data.primitiveTypes }} 15 {{- $t := capitalize . -}} 16 t{{ $t }}: foldMapInline{{ $t }}, 17 {{ end }} 18 } 19 20 func getMapInlineByPrimitiveElem(t reflect.Type) reFoldFn { 21 if t == tInterface { 22 return foldMapInlineInterface 23 } 24 return _mapInlineMapping[t] 25 } 26 27 func foldMapInlineInterface(C *foldContext, v reflect.Value) (err error) { 28 ptr := unsafe.Pointer(v.Pointer()) 29 if ptr == nil { 30 return nil 31 } 32 33 m := *((*map[string]interface{})(unsafe.Pointer(&ptr))) 34 for k, v := range m { 35 if err = C.OnKey(k); err != nil { 36 return err 37 } 38 if err = foldInterfaceValue(C, v); err != nil { 39 return err 40 } 41 } 42 return 43 } 44 45 {{ range data.primitiveTypes }} 46 {{ $t := capitalize . }} 47 func foldMapInline{{ $t }}(C *foldContext, v reflect.Value) (err error) { 48 ptr := unsafe.Pointer(v.Pointer()) 49 if ptr == nil { 50 return nil 51 } 52 53 m := *((*map[string]{{ . }})(unsafe.Pointer(&ptr))) 54 for k, v := range m { 55 if err = C.OnKey(k); err != nil { 56 return err 57 } 58 if err = C.On{{ $t }}(v); err != nil { 59 return err 60 } 61 } 62 return 63 } 64 {{ end }}