8
8
import struct
9
9
import uuid
10
10
import 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
12
24
13
25
14
26
from .message import Message , Header , Properties
39
51
c_double = struct .Struct ('>d' )
40
52
41
53
42
- def _decode_null (buffer ):
43
- # type: (memoryview) -> Tuple[memoryview, None]
54
+ def _decode_null (buffer : memoryview ) -> Tuple [memoryview , None ]:
44
55
return buffer , None
45
56
46
57
47
- def _decode_true (buffer ):
48
- # type: (memoryview) -> Tuple[memoryview, bool]
58
+ def _decode_true (buffer : memoryview ) -> Tuple [memoryview , Literal [True ]]:
49
59
return buffer , True
50
60
51
61
52
- def _decode_false (buffer ):
53
- # type: (memoryview) -> Tuple[memoryview, bool]
62
+ def _decode_false (buffer : memoryview ) -> Tuple [memoryview , Literal [False ]]:
54
63
return buffer , False
55
64
56
65
57
- def _decode_zero (buffer ):
58
- # type: (memoryview) -> Tuple[memoryview, int]
66
+ def _decode_zero (buffer : memoryview ) -> Tuple [memoryview , Literal [0 ]]:
59
67
return buffer , 0
60
68
61
69
62
- def _decode_empty (buffer ):
63
- # type: (memoryview) -> Tuple[memoryview, List[None]]
70
+ def _decode_empty (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
64
71
return buffer , []
65
72
66
73
67
- def _decode_boolean (buffer ):
68
- # type: (memoryview) -> Tuple[memoryview, bool]
74
+ def _decode_boolean (buffer : memoryview ) -> Tuple [memoryview , bool ]:
69
75
return buffer [1 :], buffer [:1 ] == b'\x01 '
70
76
71
77
72
- def _decode_ubyte (buffer ):
73
- # type: (memoryview) -> Tuple[memoryview, int]
78
+ def _decode_ubyte (buffer : memoryview ) -> Tuple [memoryview , int ]:
74
79
return buffer [1 :], buffer [0 ]
75
80
76
81
77
- def _decode_ushort (buffer ):
78
- # type: (memoryview) -> Tuple[memoryview, int]
82
+ def _decode_ushort (buffer : memoryview ) -> Tuple [memoryview , int ]:
79
83
return buffer [2 :], c_unsigned_short .unpack (buffer [:2 ])[0 ]
80
84
81
85
82
- def _decode_uint_small (buffer ):
83
- # type: (memoryview) -> Tuple[memoryview, int]
86
+ def _decode_uint_small (buffer : memoryview ) -> Tuple [memoryview , int ]:
84
87
return buffer [1 :], buffer [0 ]
85
88
86
89
87
- def _decode_uint_large (buffer ):
88
- # type: (memoryview) -> Tuple[memoryview, int]
90
+ def _decode_uint_large (buffer : memoryview ) -> Tuple [memoryview , int ]:
89
91
return buffer [4 :], c_unsigned_int .unpack (buffer [:4 ])[0 ]
90
92
91
93
92
- def _decode_ulong_small (buffer ):
93
- # type: (memoryview) -> Tuple[memoryview, int]
94
+ def _decode_ulong_small (buffer : memoryview )-> Tuple [memoryview , int ]:
94
95
return buffer [1 :], buffer [0 ]
95
96
96
97
97
- def _decode_ulong_large (buffer ):
98
- # type: (memoryview) -> Tuple[memoryview, int]
98
+ def _decode_ulong_large (buffer : memoryview )-> Tuple [memoryview , int ]:
99
99
return buffer [8 :], c_unsigned_long_long .unpack (buffer [:8 ])[0 ]
100
100
101
101
102
- def _decode_byte (buffer ):
103
- # type: (memoryview) -> Tuple[memoryview, int]
102
+ def _decode_byte (buffer : memoryview )-> Tuple [memoryview , int ]:
104
103
return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
105
104
106
105
107
- def _decode_short (buffer ):
108
- # type: (memoryview) -> Tuple[memoryview, int]
106
+ def _decode_short (buffer : memoryview )-> Tuple [memoryview , int ]:
109
107
return buffer [2 :], c_signed_short .unpack (buffer [:2 ])[0 ]
110
108
111
109
112
- def _decode_int_small (buffer ):
113
- # type: (memoryview) -> Tuple[memoryview, int]
110
+ def _decode_int_small (buffer : memoryview )-> Tuple [memoryview , int ]:
114
111
return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
115
112
116
113
117
- def _decode_int_large (buffer ):
118
- # type: (memoryview) -> Tuple[memoryview, int]
114
+ def _decode_int_large (buffer : memoryview )-> Tuple [memoryview , int ]:
119
115
return buffer [4 :], c_signed_int .unpack (buffer [:4 ])[0 ]
120
116
121
117
122
- def _decode_long_small (buffer ):
123
- # type: (memoryview) -> Tuple[memoryview, int]
118
+ def _decode_long_small (buffer : memoryview )-> Tuple [memoryview , int ]:
124
119
return buffer [1 :], c_signed_char .unpack (buffer [:1 ])[0 ]
125
120
126
121
127
- def _decode_long_large (buffer ):
128
- # type: (memoryview) -> Tuple[memoryview, int]
122
+ def _decode_long_large (buffer : memoryview )-> Tuple [memoryview , int ]:
129
123
return buffer [8 :], c_signed_long_long .unpack (buffer [:8 ])[0 ]
130
124
131
125
132
- def _decode_float (buffer ):
133
- # type: (memoryview) -> Tuple[memoryview, float]
126
+ def _decode_float (buffer : memoryview ) -> Tuple [memoryview , float ]:
134
127
return buffer [4 :], c_float .unpack (buffer [:4 ])[0 ]
135
128
136
129
137
- def _decode_double (buffer ):
138
- # type: (memoryview) -> Tuple[memoryview, float]
130
+ def _decode_double (buffer : memoryview ) -> Tuple [memoryview , float ]:
139
131
return buffer [8 :], c_double .unpack (buffer [:8 ])[0 ]
140
132
141
133
142
- def _decode_timestamp (buffer ):
143
- # type: (memoryview) -> Tuple[memoryview, int]
134
+ def _decode_timestamp (buffer : memoryview ) -> Tuple [memoryview , int ]:
144
135
return buffer [8 :], c_signed_long_long .unpack (buffer [:8 ])[0 ]
145
136
146
137
147
- def _decode_uuid (buffer ):
148
- # type: (memoryview) -> Tuple[memoryview, uuid.UUID]
138
+ def _decode_uuid (buffer : memoryview ) -> Tuple [memoryview , uuid .UUID ]:
149
139
return buffer [16 :], uuid .UUID (bytes = buffer [:16 ].tobytes ())
150
140
151
141
152
- def _decode_binary_small (buffer ):
153
- # type: (memoryview) -> Tuple[memoryview, bytes]
142
+ def _decode_binary_small (buffer : memoryview ) -> Tuple [memoryview , bytes ]:
154
143
length_index = buffer [0 ] + 1
155
144
return buffer [length_index :], buffer [1 :length_index ].tobytes ()
156
145
157
146
158
- def _decode_binary_large (buffer ):
159
- # type: (memoryview) -> Tuple[memoryview, bytes]
147
+ def _decode_binary_large (buffer : memoryview ) -> Tuple [memoryview , bytes ]:
160
148
length_index = c_unsigned_long .unpack (buffer [:4 ])[0 ] + 4
161
149
return buffer [length_index :], buffer [4 :length_index ].tobytes ()
162
150
163
151
164
- def _decode_list_small (buffer ):
165
- # type: (memoryview) -> Tuple[memoryview, List[Any]]
152
+ def _decode_list_small (buffer : memoryview )-> Tuple [memoryview , List [Any ]]:
166
153
count = buffer [1 ]
167
154
buffer = buffer [2 :]
168
155
values = [None ] * count
@@ -171,8 +158,7 @@ def _decode_list_small(buffer):
171
158
return buffer , values
172
159
173
160
174
- def _decode_list_large (buffer ):
175
- # type: (memoryview) -> Tuple[memoryview, List[Any]]
161
+ def _decode_list_large (buffer : memoryview )-> Tuple [memoryview , List [Any ]]:
176
162
count = c_unsigned_long .unpack (buffer [4 :8 ])[0 ]
177
163
buffer = buffer [8 :]
178
164
values = [None ] * count
@@ -181,8 +167,7 @@ def _decode_list_large(buffer):
181
167
return buffer , values
182
168
183
169
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 ]]:
186
171
count = int (buffer [1 ]/ 2 )
187
172
buffer = buffer [2 :]
188
173
values = {}
@@ -193,8 +178,7 @@ def _decode_map_small(buffer):
193
178
return buffer , values
194
179
195
180
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 ]]:
198
182
count = int (c_unsigned_long .unpack (buffer [4 :8 ])[0 ]/ 2 )
199
183
buffer = buffer [8 :]
200
184
values = {}
@@ -205,8 +189,7 @@ def _decode_map_large(buffer):
205
189
return buffer , values
206
190
207
191
208
- def _decode_array_small (buffer ):
209
- # type: (memoryview) -> Tuple[memoryview, List[Any]]
192
+ def _decode_array_small (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
210
193
count = buffer [1 ] # Ignore first byte (size) and just rely on count
211
194
if count :
212
195
subconstructor = buffer [2 ]
@@ -218,8 +201,7 @@ def _decode_array_small(buffer):
218
201
return buffer [2 :], []
219
202
220
203
221
- def _decode_array_large (buffer ):
222
- # type: (memoryview) -> Tuple[memoryview, List[Any]]
204
+ def _decode_array_large (buffer : memoryview ) -> Tuple [memoryview , List [Any ]]:
223
205
count = c_unsigned_long .unpack (buffer [4 :8 ])[0 ]
224
206
if count :
225
207
subconstructor = buffer [8 ]
@@ -231,8 +213,7 @@ def _decode_array_large(buffer):
231
213
return buffer [8 :], []
232
214
233
215
234
- def _decode_described (buffer ):
235
- # type: (memoryview) -> Tuple[memoryview, Any]
216
+ def _decode_described (buffer : memoryview ) -> Tuple [memoryview , object ]:
236
217
# TODO: to move the cursor of the buffer to the described value based on size of the
237
218
# descriptor without decoding descriptor value
238
219
composite_type = buffer [0 ]
@@ -245,8 +226,7 @@ def _decode_described(buffer):
245
226
return buffer , value
246
227
247
228
248
- def decode_payload (buffer ):
249
- # type: (memoryview) -> Message
229
+ def decode_payload (buffer : memoryview ) -> Message :
250
230
message : Dict [str , Union [Properties , Header , Dict , bytes , List ]] = {}
251
231
while buffer :
252
232
# Ignore the first two bytes, they will always be the constructors for
@@ -279,12 +259,12 @@ def decode_payload(buffer):
279
259
message ["footer" ] = value
280
260
# TODO: we can possibly swap out the Message construct with a TypedDict
281
261
# for both input and output so we get the best of both.
262
+ # casting to TypedDict with named fields to allow for unpacking with **
282
263
message_properties = cast ("MessageDict" , message )
283
264
return Message (** message_properties )
284
265
285
266
286
- def decode_frame (data ):
287
- # type: (memoryview) -> Tuple[int, List[Any]]
267
+ def decode_frame (data : memoryview ) -> Tuple [int , List [Any ]]:
288
268
# Ignore the first two bytes, they will always be the constructors for
289
269
# described type then ulong.
290
270
frame_type = data [2 ]
@@ -305,8 +285,7 @@ def decode_frame(data):
305
285
return frame_type , fields
306
286
307
287
308
- def decode_empty_frame (header ):
309
- # type: (memoryview) -> Tuple[int, bytes]
288
+ def decode_empty_frame (header : memoryview ) -> Tuple [int , bytes ]:
310
289
if header [0 :4 ] == _HEADER_PREFIX :
311
290
return 0 , header .tobytes ()
312
291
if header [5 ] == 0 :
0 commit comments