// get into map pointed at by v func getMap(data *C.pn_data_t, v interface{}) { mapValue := reflect.ValueOf(v).Elem() mapValue.Set(reflect.MakeMap(mapValue.Type())) // Clear the map switch pnType := C.pn_data_type(data); pnType { case C.PN_MAP: count := int(C.pn_data_get_map(data)) if bool(C.pn_data_enter(data)) { defer C.pn_data_exit(data) for i := 0; i < count/2; i++ { if bool(C.pn_data_next(data)) { key := reflect.New(mapValue.Type().Key()) unmarshal(key.Interface(), data) if bool(C.pn_data_next(data)) { val := reflect.New(mapValue.Type().Elem()) unmarshal(val.Interface(), data) mapValue.SetMapIndex(key.Elem(), val.Elem()) } } } } case C.PN_INVALID: // Leave the map empty default: panic(newUnmarshalError(pnType, v)) } }
func getList(data *C.pn_data_t, v interface{}) { pnType := C.pn_data_type(data) if pnType != C.PN_LIST { panic(newUnmarshalError(pnType, v)) } count := int(C.pn_data_get_list(data)) listValue := reflect.MakeSlice(reflect.TypeOf(v).Elem(), count, count) if bool(C.pn_data_enter(data)) { for i := 0; i < count; i++ { if bool(C.pn_data_next(data)) { val := reflect.New(listValue.Type().Elem()) unmarshal(val.Interface(), data) listValue.Index(i).Set(val.Elem()) } } C.pn_data_exit(data) } reflect.ValueOf(v).Elem().Set(listValue) }
func rewindMap(data *C.pn_data_t) (v map[string]interface{}) { C.pn_data_rewind(data) C.pn_data_next(data) unmarshal(&v, data) return v }
func rewindUnmarshal(v interface{}, data *C.pn_data_t) { C.pn_data_rewind(data) C.pn_data_next(data) unmarshal(v, data) }
func rewindGet(data *C.pn_data_t) (v interface{}) { C.pn_data_rewind(data) C.pn_data_next(data) unmarshal(&v, data) return v }