github.com/mattn/anko@v0.1.10/vm/vmConvertToXGo112.go (about)

     1  // +build go1.12
     2  
     3  package vm
     4  
     5  import (
     6  	"reflect"
     7  )
     8  
     9  // convertMap trys to covert the reflect.Value map to the map reflect.Type
    10  func convertMap(rv reflect.Value, rt reflect.Type) (reflect.Value, error) {
    11  	rtKey := rt.Key()
    12  	rtElem := rt.Elem()
    13  
    14  	// create new map
    15  	// note creating slice as work around to create map
    16  	// just doing MakeMap can give incorrect type for defined types
    17  	newMap := reflect.MakeSlice(reflect.SliceOf(rt), 0, 1)
    18  	newMap = reflect.Append(newMap, reflect.MakeMap(reflect.MapOf(rtKey, rtElem))).Index(0)
    19  
    20  	// copy keys to new map
    21  	// For Go 1.12 and after can use MapRange
    22  	mapIter := rv.MapRange()
    23  	var value reflect.Value
    24  	for mapIter.Next() {
    25  		newKey, err := convertReflectValueToType(mapIter.Key(), rtKey)
    26  		if err != nil {
    27  			return rv, err
    28  		}
    29  		value, err = convertReflectValueToType(mapIter.Value(), rtElem)
    30  		if err != nil {
    31  			return rv, err
    32  		}
    33  		newMap.SetMapIndex(newKey, value)
    34  	}
    35  
    36  	return newMap, nil
    37  }