1
1
from botocore .parsers import (
2
2
LOG ,
3
+ BaseCBORParser ,
3
4
BaseEventStreamParser ,
4
5
BaseJSONParser ,
5
6
BaseRestParser ,
7
+ BaseRpcV2Parser ,
6
8
BaseXMLResponseParser ,
7
9
EC2QueryParser ,
10
+ EventStreamCBORParser ,
8
11
EventStreamJSONParser ,
9
12
EventStreamXMLParser ,
10
13
JSONParser ,
15
18
ResponseParserFactory ,
16
19
RestJSONParser ,
17
20
RestXMLParser ,
21
+ RpcV2CBORParser ,
18
22
lowercase_dict ,
19
23
)
20
24
@@ -88,6 +92,10 @@ class AioBaseJSONParser(BaseJSONParser, AioResponseParser):
88
92
pass
89
93
90
94
95
+ class AioBaseCBORParser (BaseCBORParser , AioResponseParser ):
96
+ pass
97
+
98
+
91
99
class AioBaseEventStreamParser (BaseEventStreamParser , AioResponseParser ):
92
100
pass
93
101
@@ -104,6 +112,12 @@ class AioEventStreamXMLParser(
104
112
pass
105
113
106
114
115
+ class AioEventStreamCBORParser (
116
+ EventStreamCBORParser , AioBaseEventStreamParser , AioBaseCBORParser
117
+ ):
118
+ pass
119
+
120
+
107
121
class AioJSONParser (JSONParser , AioBaseJSONParser ):
108
122
EVENT_STREAM_PARSER_CLS = AioEventStreamJSONParser
109
123
@@ -137,10 +151,46 @@ class AioBaseRestParser(BaseRestParser, AioResponseParser):
137
151
pass
138
152
139
153
154
+ class AioBaseRpcV2Parser (BaseRpcV2Parser , AioResponseParser ):
155
+ async def _do_parse (self , response , shape ):
156
+ parsed = {}
157
+ if shape is not None :
158
+ event_stream_name = shape .event_stream_name
159
+ if event_stream_name :
160
+ parsed = await self ._handle_event_stream (
161
+ response , shape , event_stream_name
162
+ )
163
+ else :
164
+ parsed = {}
165
+ self ._parse_payload (response , shape , parsed )
166
+ parsed ['ResponseMetadata' ] = self ._populate_response_metadata (
167
+ response
168
+ )
169
+ return parsed
170
+
171
+
140
172
class AioRestJSONParser (RestJSONParser , AioBaseRestParser , AioBaseJSONParser ):
141
173
EVENT_STREAM_PARSER_CLS = AioEventStreamJSONParser
142
174
143
175
176
+ class AioRpcV2CBORParser (
177
+ RpcV2CBORParser , AioBaseRpcV2Parser , AioBaseCBORParser
178
+ ):
179
+ EVENT_STREAM_PARSER_CLS = AioEventStreamCBORParser
180
+
181
+ async def _handle_event_stream (self , response , shape , event_name ):
182
+ event_stream_shape = shape .members [event_name ]
183
+ event_stream = self ._create_event_stream (response , event_stream_shape )
184
+ try :
185
+ event = await event_stream .get_initial_response ()
186
+ except NoInitialResponseError :
187
+ error_msg = 'First event was not of type initial-response'
188
+ raise ResponseParserError (error_msg )
189
+ parsed = self ._initial_body_parse (event .payload )
190
+ parsed [event_name ] = event_stream
191
+ return parsed
192
+
193
+
144
194
class AioRestXMLParser (
145
195
RestXMLParser , AioBaseRestParser , AioBaseXMLResponseParser
146
196
):
@@ -153,4 +203,5 @@ class AioRestXMLParser(
153
203
'json' : AioJSONParser ,
154
204
'rest-json' : AioRestJSONParser ,
155
205
'rest-xml' : AioRestXMLParser ,
206
+ 'smithy-rpc-v2-cbor' : AioRpcV2CBORParser ,
156
207
}
0 commit comments