in internal/kernel/conversions.go [326:370]
func (c *Client) castValToMap(data reflect.Value, mapType reflect.Type) (m reflect.Value, ok bool) {
ok = false
if data.Kind() != reflect.Map || data.Type().Key().Kind() != reflect.String {
return
}
if mapType.Kind() == reflect.Map && mapType.Key().Kind() != reflect.String {
return
}
if mapType == anyType {
mapType = reflect.TypeOf((map[string]interface{})(nil))
}
dataIter := data.MapRange()
for dataIter.Next() {
key := dataIter.Key().String()
if key != "$jsii.map" {
continue
}
// Finding value type requries extracting from reflect.Value
// otherwise .Kind() returns `interface{}`
val := reflect.ValueOf(dataIter.Value().Interface())
if val.Kind() != reflect.Map {
return
}
ok = true
m = reflect.MakeMap(mapType)
iter := val.MapRange()
for iter.Next() {
val := iter.Value()
// Note: reflect.New(t) returns a pointer to a newly allocated t
convertedVal := reflect.New(mapType.Elem()).Elem()
c.castAndSetToPtr(convertedVal, val)
m.SetMapIndex(iter.Key(), convertedVal)
}
return
}
return
}