88import struct
99import uuid
1010import logging
11- from typing import List , Optional , Tuple , Dict , Callable , Any , cast , Union , TYPE_CHECKING # pylint: disable=unused-import
11+ from typing import (
12+ Callable ,
13+ List ,
14+ Optional ,
15+ Tuple ,
16+ Dict ,
17+ Any ,
18+ Union ,
19+ cast ,
20+ TYPE_CHECKING ,
21+ )
22+
23+ from typing_extensions import Literal
1224
1325
1426from .message import Message , Header , Properties
3951c_double = struct .Struct ('>d' )
4052
4153
42- def _decode_null (buffer ):
43- # type: (memoryview) -> Tuple[memoryview, None]
54+ def _decode_null (buffer : memoryview ) -> Tuple [memoryview , None ]:
4455 return buffer , None
4556
4657
47- def _decode_true (buffer ):
48- # type: (memoryview) -> Tuple[memoryview, bool]
58+ def _decode_true (buffer : memoryview ) -> Tuple [memoryview , Literal [True ]]:
4959 return buffer , True
5060
5161
52- def _decode_false (buffer ):
53- # type: (memoryview) -> Tuple[memoryview, bool]
62+ def _decode_false (buffer : memoryview ) -> Tuple [memoryview , Literal [False ]]:
5463 return buffer , False
5564
5665
57- def _decode_zero (buffer ):
58- # type: (memoryview) -> Tuple[memoryview, int]
66+ def _decode_zero (buffer : memoryview ) -> Tuple [memoryview , Literal [0 ]]:
5967 return buffer , 0
6068
6169
62- def _decode_empty (buffer ):
63- # type: (memoryview) -> Tuple[memoryview, List[None]]
70+ def _decode_empty (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
6471 return buffer , []
6572
6673
67- def _decode_boolean (buffer ):
68- # type: (memoryview) -> Tuple[memoryview, bool]
74+ def _decode_boolean (buffer : memoryview ) -> Tuple [memoryview , bool ]:
6975 return buffer [1 :], buffer [:1 ] == b'\x01 '
7076
7177
72- def _decode_ubyte (buffer ):
73- # type: (memoryview) -> Tuple[memoryview, int]
78+ def _decode_ubyte (buffer : memoryview ) -> Tuple [memoryview , int ]:
7479 return buffer [1 :], buffer [0 ]
7580
7681
77- def _decode_ushort (buffer ):
78- # type: (memoryview) -> Tuple[memoryview, int]
82+ def _decode_ushort (buffer : memoryview ) -> Tuple [memoryview , int ]:
7983 return buffer [2 :], c_unsigned_short .unpack (buffer [:2 ])[0 ]
8084
8185
82- def _decode_uint_small (buffer ):
83- # type: (memoryview) -> Tuple[memoryview, int]
86+ def _decode_uint_small (buffer : memoryview ) -> Tuple [memoryview , int ]:
8487 return buffer [1 :], buffer [0 ]
8588
8689
87- def _decode_uint_large (buffer ):
88- # type: (memoryview) -> Tuple[memoryview, int]
90+ def _decode_uint_large (buffer : memoryview ) -> Tuple [memoryview , int ]:
8991 return buffer [4 :], c_unsigned_int .unpack (buffer [:4 ])[0 ]
9092
9193
92- def _decode_ulong_small (buffer ):
93- # type: (memoryview) -> Tuple[memoryview, int]
94+ def _decode_ulong_small (buffer : memoryview )-> Tuple [memoryview , int ]:
9495 return buffer [1 :], buffer [0 ]
9596
9697
97- def _decode_ulong_large (buffer ):
98- # type: (memoryview) -> Tuple[memoryview, int]
98+ def _decode_ulong_large (buffer : memoryview )-> Tuple [memoryview , int ]:
9999 return buffer [8 :], c_unsigned_long_long .unpack (buffer [:8 ])[0 ]
100100
101101
102- def _decode_byte (buffer ):
103- # type: (memoryview) -> Tuple[memoryview, int]
102+ def _decode_byte (buffer : memoryview )-> Tuple [memoryview , int ]:
104103 return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
105104
106105
107- def _decode_short (buffer ):
108- # type: (memoryview) -> Tuple[memoryview, int]
106+ def _decode_short (buffer : memoryview )-> Tuple [memoryview , int ]:
109107 return buffer [2 :], c_signed_short .unpack (buffer [:2 ])[0 ]
110108
111109
112- def _decode_int_small (buffer ):
113- # type: (memoryview) -> Tuple[memoryview, int]
110+ def _decode_int_small (buffer : memoryview )-> Tuple [memoryview , int ]:
114111 return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
115112
116113
117- def _decode_int_large (buffer ):
118- # type: (memoryview) -> Tuple[memoryview, int]
114+ def _decode_int_large (buffer : memoryview )-> Tuple [memoryview , int ]:
119115 return buffer [4 :], c_signed_int .unpack (buffer [:4 ])[0 ]
120116
121117
122- def _decode_long_small (buffer ):
123- # type: (memoryview) -> Tuple[memoryview, int]
118+ def _decode_long_small (buffer : memoryview )-> Tuple [memoryview , int ]:
124119 return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
125120
126121
127- def _decode_long_large (buffer ):
128- # type: (memoryview) -> Tuple[memoryview, int]
122+ def _decode_long_large (buffer : memoryview )-> Tuple [memoryview , int ]:
129123 return buffer [8 :], c_signed_long_long .unpack (buffer [:8 ])[0 ]
130124
131125
132- def _decode_float (buffer ):
133- # type: (memoryview) -> Tuple[memoryview, float]
126+ def _decode_float (buffer : memoryview ) -> Tuple [memoryview , float ]:
134127 return buffer [4 :], c_float .unpack (buffer [:4 ])[0 ]
135128
136129
137- def _decode_double (buffer ):
138- # type: (memoryview) -> Tuple[memoryview, float]
130+ def _decode_double (buffer : memoryview ) -> Tuple [memoryview , float ]:
139131 return buffer [8 :], c_double .unpack (buffer [:8 ])[0 ]
140132
141133
142- def _decode_timestamp (buffer ):
143- # type: (memoryview) -> Tuple[memoryview, int]
134+ def _decode_timestamp (buffer : memoryview ) -> Tuple [memoryview , int ]:
144135 return buffer [8 :], c_signed_long_long .unpack (buffer [:8 ])[0 ]
145136
146137
147- def _decode_uuid (buffer ):
148- # type: (memoryview) -> Tuple[memoryview, uuid.UUID]
138+ def _decode_uuid (buffer : memoryview ) -> Tuple [memoryview , uuid .UUID ]:
149139 return buffer [16 :], uuid .UUID (bytes = buffer [:16 ].tobytes ())
150140
151141
152- def _decode_binary_small (buffer ):
153- # type: (memoryview) -> Tuple[memoryview, bytes]
142+ def _decode_binary_small (buffer : memoryview ) -> Tuple [memoryview , bytes ]:
154143 length_index = buffer [0 ] + 1
155144 return buffer [length_index :], buffer [1 :length_index ].tobytes ()
156145
157146
158- def _decode_binary_large (buffer ):
159- # type: (memoryview) -> Tuple[memoryview, bytes]
147+ def _decode_binary_large (buffer : memoryview ) -> Tuple [memoryview , bytes ]:
160148 length_index = c_unsigned_long .unpack (buffer [:4 ])[0 ] + 4
161149 return buffer [length_index :], buffer [4 :length_index ].tobytes ()
162150
163151
164- def _decode_list_small (buffer ):
165- # type: (memoryview) -> Tuple[memoryview, List[Any]]
152+ def _decode_list_small (buffer : memoryview )-> Tuple [memoryview , List [Any ]]:
166153 count = buffer [1 ]
167154 buffer = buffer [2 :]
168155 values = [None ] * count
@@ -171,8 +158,7 @@ def _decode_list_small(buffer):
171158 return buffer , values
172159
173160
174- def _decode_list_large (buffer ):
175- # type: (memoryview) -> Tuple[memoryview, List[Any]]
161+ def _decode_list_large (buffer : memoryview )-> Tuple [memoryview , List [Any ]]:
176162 count = c_unsigned_long .unpack (buffer [4 :8 ])[0 ]
177163 buffer = buffer [8 :]
178164 values = [None ] * count
@@ -181,8 +167,7 @@ def _decode_list_large(buffer):
181167 return buffer , values
182168
183169
184- def _decode_map_small (buffer ):
185- # type: (memoryview) -> Tuple[memoryview, Dict[Any, Any]]
170+ def _decode_map_small (buffer : memoryview ) -> Tuple [memoryview , Dict [Any , Any ]]:
186171 count = int (buffer [1 ]/ 2 )
187172 buffer = buffer [2 :]
188173 values = {}
@@ -193,8 +178,7 @@ def _decode_map_small(buffer):
193178 return buffer , values
194179
195180
196- def _decode_map_large (buffer ):
197- # type: (memoryview) -> Tuple[memoryview, Dict[Any, Any]]
181+ def _decode_map_large (buffer : memoryview ) -> Tuple [memoryview , Dict [Any , Any ]]:
198182 count = int (c_unsigned_long .unpack (buffer [4 :8 ])[0 ]/ 2 )
199183 buffer = buffer [8 :]
200184 values = {}
@@ -205,8 +189,7 @@ def _decode_map_large(buffer):
205189 return buffer , values
206190
207191
208- def _decode_array_small (buffer ):
209- # type: (memoryview) -> Tuple[memoryview, List[Any]]
192+ def _decode_array_small (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
210193 count = buffer [1 ] # Ignore first byte (size) and just rely on count
211194 if count :
212195 subconstructor = buffer [2 ]
@@ -218,8 +201,7 @@ def _decode_array_small(buffer):
218201 return buffer [2 :], []
219202
220203
221- def _decode_array_large (buffer ):
222- # type: (memoryview) -> Tuple[memoryview, List[Any]]
204+ def _decode_array_large (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
223205 count = c_unsigned_long .unpack (buffer [4 :8 ])[0 ]
224206 if count :
225207 subconstructor = buffer [8 ]
@@ -231,8 +213,7 @@ def _decode_array_large(buffer):
231213 return buffer [8 :], []
232214
233215
234- def _decode_described (buffer ):
235- # type: (memoryview) -> Tuple[memoryview, Any]
216+ def _decode_described (buffer : memoryview ) -> Tuple [memoryview , object ]:
236217 # TODO: to move the cursor of the buffer to the described value based on size of the
237218 # descriptor without decoding descriptor value
238219 composite_type = buffer [0 ]
@@ -245,8 +226,7 @@ def _decode_described(buffer):
245226 return buffer , value
246227
247228
248- def decode_payload (buffer ):
249- # type: (memoryview) -> Message
229+ def decode_payload (buffer : memoryview ) -> Message :
250230 message : Dict [str , Union [Properties , Header , Dict , bytes , List ]] = {}
251231 while buffer :
252232 # Ignore the first two bytes, they will always be the constructors for
@@ -279,12 +259,12 @@ def decode_payload(buffer):
279259 message ["footer" ] = value
280260 # TODO: we can possibly swap out the Message construct with a TypedDict
281261 # for both input and output so we get the best of both.
262+ # casting to TypedDict with named fields to allow for unpacking with **
282263 message_properties = cast ("MessageDict" , message )
283264 return Message (** message_properties )
284265
285266
286- def decode_frame (data ):
287- # type: (memoryview) -> Tuple[int, List[Any]]
267+ def decode_frame (data : memoryview ) -> Tuple [int , List [Any ]]:
288268 # Ignore the first two bytes, they will always be the constructors for
289269 # described type then ulong.
290270 frame_type = data [2 ]
@@ -305,8 +285,7 @@ def decode_frame(data):
305285 return frame_type , fields
306286
307287
308- def decode_empty_frame (header ):
309- # type: (memoryview) -> Tuple[int, bytes]
288+ def decode_empty_frame (header : memoryview ) -> Tuple [int , bytes ]:
310289 if header [0 :4 ] == _HEADER_PREFIX :
311290 return 0 , header .tobytes ()
312291 if header [5 ] == 0 :
0 commit comments