in go/pkg/amqp/unmarshal.go [535:605]
func getInterface(data *C.pn_data_t, vp *interface{}) {
pnType := C.pn_data_type(data)
switch pnType {
case C.PN_BOOL:
*vp = bool(C.pn_data_get_bool(data))
case C.PN_UBYTE:
*vp = uint8(C.pn_data_get_ubyte(data))
case C.PN_BYTE:
*vp = int8(C.pn_data_get_byte(data))
case C.PN_USHORT:
*vp = uint16(C.pn_data_get_ushort(data))
case C.PN_SHORT:
*vp = int16(C.pn_data_get_short(data))
case C.PN_UINT:
*vp = uint32(C.pn_data_get_uint(data))
case C.PN_INT:
*vp = int32(C.pn_data_get_int(data))
case C.PN_CHAR:
*vp = Char(C.pn_data_get_char(data))
case C.PN_ULONG:
*vp = uint64(C.pn_data_get_ulong(data))
case C.PN_LONG:
*vp = int64(C.pn_data_get_long(data))
case C.PN_FLOAT:
*vp = float32(C.pn_data_get_float(data))
case C.PN_DOUBLE:
*vp = float64(C.pn_data_get_double(data))
case C.PN_BINARY:
*vp = Binary(goBytes(C.pn_data_get_binary(data)))
case C.PN_STRING:
*vp = goString(C.pn_data_get_string(data))
case C.PN_SYMBOL:
*vp = Symbol(goString(C.pn_data_get_symbol(data)))
case C.PN_TIMESTAMP:
*vp = goTime(C.pn_data_get_timestamp(data))
case C.PN_UUID:
var u UUID
unmarshal(&u, data)
*vp = u
case C.PN_MAP:
// We will try to unmarshal as a Map first, if that fails try AnyMap
m := make(Map, int(C.pn_data_get_map(data))/2)
if err := recoverUnmarshal(&m, data); err == nil {
*vp = m
} else {
am := make(AnyMap, int(C.pn_data_get_map(data))/2)
unmarshal(&am, data)
*vp = am
}
case C.PN_LIST:
l := List{}
unmarshal(&l, data)
*vp = l
case C.PN_ARRAY:
sp := getArrayStore(data) // interface{} containing T* for suitable T
unmarshal(sp, data)
*vp = reflect.ValueOf(sp).Elem().Interface()
case C.PN_DESCRIBED:
d := Described{}
unmarshal(&d, data)
*vp = d
case C.PN_NULL:
*vp = nil
case C.PN_INVALID:
// Allow decoding from an empty data object to an interface, treat it like NULL.
// This happens when optional values or properties are omitted from a message.
*vp = nil
default: // Don't know how to handle this
panic(newUnmarshalError(pnType, vp))
}
}