2222from typing_extensions import Literal
2323
2424
25+ from . import described
2526from .message import Message , Header , Properties
2627
2728if TYPE_CHECKING :
@@ -153,6 +154,7 @@ def _decode_binary_large(buffer: memoryview) -> Tuple[memoryview, bytes]:
153154 length_index = c_unsigned_long .unpack (buffer [:4 ])[0 ] + 4
154155 return buffer [length_index :], buffer [4 :length_index ].tobytes ()
155156
157+
156158def _decode_decimal128 (buffer : memoryview ) -> Tuple [memoryview , decimal .Decimal ]:
157159 """
158160 Decode a Decimal128 value from the buffer.
@@ -254,23 +256,41 @@ def _decode_map_large(buffer: memoryview) -> Tuple[memoryview, Dict[Any, Any]]:
254256def _decode_array_small (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
255257 count = buffer [1 ] # Ignore first byte (size) and just rely on count
256258 if count :
257- subconstructor = buffer [2 ]
258- buffer = buffer [3 :]
259259 values = [None ] * count
260- for i in range (count ):
261- buffer , values [i ] = _DECODE_BY_CONSTRUCTOR [subconstructor ](buffer )
260+ subconstructor = buffer [2 ]
261+
262+ if subconstructor == 0 :
263+ composite_type = buffer [3 ]
264+ buffer , descriptor = _DECODE_BY_CONSTRUCTOR [composite_type ](buffer [4 :])
265+ subconstructor = buffer [0 ]
266+ buffer = buffer [1 :]
267+ for i in range (count ):
268+ buffer , values [i ] = _decode_described_array (buffer , subconstructor , descriptor )
269+ else :
270+ buffer = buffer [3 :]
271+ for i in range (count ):
272+ buffer , values [i ] = _DECODE_BY_CONSTRUCTOR [subconstructor ](buffer )
262273 return buffer , values
263274 return buffer [2 :], []
264275
265276
266277def _decode_array_large (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
267278 count = c_unsigned_long .unpack (buffer [4 :8 ])[0 ]
268279 if count :
269- subconstructor = buffer [8 ]
270- buffer = buffer [9 :]
271280 values = [None ] * count
272- for i in range (count ):
273- buffer , values [i ] = _DECODE_BY_CONSTRUCTOR [subconstructor ](buffer )
281+ subconstructor = buffer [8 ]
282+
283+ if subconstructor == 0 :
284+ composite_type = buffer [9 ]
285+ buffer , descriptor = _DECODE_BY_CONSTRUCTOR [composite_type ](buffer [10 :])
286+ subconstructor = buffer [0 ]
287+ buffer = buffer [1 :]
288+ for i in range (count ):
289+ buffer , values [i ] = _decode_described_array (buffer , subconstructor , descriptor )
290+ else :
291+ buffer = buffer [9 :]
292+ for i in range (count ):
293+ buffer , values [i ] = _DECODE_BY_CONSTRUCTOR [subconstructor ](buffer )
274294 return buffer , values
275295 return buffer [8 :], []
276296
@@ -280,7 +300,25 @@ def _decode_described(buffer: memoryview) -> Tuple[memoryview, object]:
280300 # descriptor without decoding descriptor value
281301 composite_type = buffer [0 ]
282302 buffer , descriptor = _DECODE_BY_CONSTRUCTOR [composite_type ](buffer [1 :])
283- buffer , value = _DECODE_BY_CONSTRUCTOR [buffer [0 ]](buffer [1 :])
303+ tp = buffer [0 ]
304+ buffer , value = _DECODE_BY_CONSTRUCTOR [tp ](buffer [1 :])
305+ try :
306+ value = _DESCR_BY_CONSTRUCTOR [tp ](value , descriptor = descriptor )
307+ except KeyError :
308+ pass
309+ try :
310+ composite_type = cast (int , _COMPOSITES [descriptor ])
311+ return buffer , {composite_type : value }
312+ except KeyError :
313+ return buffer , value
314+
315+
316+ def _decode_described_array (buffer : memoryview , tp , descriptor ) -> Tuple [memoryview , object ]:
317+ buffer , value = _DECODE_BY_CONSTRUCTOR [tp ](buffer )
318+ try :
319+ value = _DESCR_BY_CONSTRUCTOR [tp ](value , descriptor = descriptor )
320+ except KeyError :
321+ pass
284322 try :
285323 composite_type = cast (int , _COMPOSITES [descriptor ])
286324 return buffer , {composite_type : value }
@@ -394,3 +432,36 @@ def decode_empty_frame(header: memoryview) -> Tuple[int, bytes]:
394432_DECODE_BY_CONSTRUCTOR [209 ] = _decode_map_large
395433_DECODE_BY_CONSTRUCTOR [224 ] = _decode_array_small
396434_DECODE_BY_CONSTRUCTOR [240 ] = _decode_array_large
435+
436+ _DESCR_BY_CONSTRUCTOR = {
437+ 67 : described .DescribedInt ,
438+ 68 : described .DescribedInt ,
439+ 69 : described .DescribedList ,
440+ 80 : described .DescribedInt ,
441+ 81 : described .DescribedInt ,
442+ 82 : described .DescribedInt ,
443+ 83 : described .DescribedInt ,
444+ 84 : described .DescribedInt ,
445+ 85 : described .DescribedInt ,
446+ 96 : described .DescribedInt ,
447+ 97 : described .DescribedInt ,
448+ 112 : described .DescribedInt ,
449+ 113 : described .DescribedInt ,
450+ 114 : described .DescribedFloat ,
451+ 128 : described .DescribedInt ,
452+ 129 : described .DescribedInt ,
453+ 130 : described .DescribedFloat ,
454+ 131 : described .DescribedInt ,
455+ 160 : described .DescribedBytes ,
456+ 161 : described .DescribedBytes ,
457+ 163 : described .DescribedBytes ,
458+ 176 : described .DescribedBytes ,
459+ 177 : described .DescribedBytes ,
460+ 179 : described .DescribedBytes ,
461+ 192 : described .DescribedList ,
462+ 193 : described .DescribedDict ,
463+ 208 : described .DescribedList ,
464+ 209 : described .DescribedDict ,
465+ 224 : described .DescribedList ,
466+ 240 : described .DescribedList ,
467+ }
0 commit comments