11# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22# SPDX-License-Identifier: Apache-2.0
3- from dataclasses import dataclass
43import datetime
5- from typing import Any , Self , ClassVar , Literal
6-
7- from aws_event_stream .events import EventMessage , Short , Byte , Long
4+ from dataclasses import dataclass
5+ from typing import Any , ClassVar , Literal , Self
86
9- from smithy_core .serializers import ShapeSerializer
107from smithy_core .deserializers import ShapeDeserializer
11- from smithy_core .schemas import Schema
128from smithy_core .exceptions import SmithyException
13- from smithy_core .shapes import ShapeID , ShapeType
14- from smithy_core .traits import Trait
159from smithy_core .prelude import (
10+ BLOB ,
1611 BOOLEAN ,
1712 BYTE ,
18- SHORT ,
1913 INTEGER ,
2014 LONG ,
21- BLOB ,
15+ SHORT ,
2216 STRING ,
2317 TIMESTAMP ,
2418)
19+ from smithy_core .schemas import Schema
20+ from smithy_core .serializers import ShapeSerializer
21+ from smithy_core .shapes import ShapeID , ShapeType
22+ from smithy_core .traits import Trait
2523
24+ from aws_event_stream .events import Byte , EventMessage , Long , Short
2625
2726EVENT_HEADER_TRAIT = Trait (id = ShapeID ("smithy.api#eventHeader" ))
2827EVENT_PAYLOAD_TRAIT = Trait (id = ShapeID ("smithy.api#eventPayload" ))
6665 },
6766)
6867
68+ SCHEMA_BLOB_PAYLOAD_EVENT = Schema .collection (
69+ id = ShapeID ("smithy.example#BlobPayloadEvent" ),
70+ members = {
71+ "header" : {
72+ "index" : 0 ,
73+ "target" : STRING ,
74+ "traits" : [EVENT_HEADER_TRAIT , REQUIRED_TRAIT ],
75+ },
76+ "payload" : {
77+ "index" : 1 ,
78+ "target" : BLOB ,
79+ "traits" : [EVENT_PAYLOAD_TRAIT , REQUIRED_TRAIT ],
80+ },
81+ },
82+ )
83+
6984SCHEMA_ERROR_EVENT = Schema .collection (
7085 id = ShapeID ("smithy.example#ErrorEvent" ),
7186 members = {"message" : {"index" : 0 , "target" : STRING , "traits" : [REQUIRED_TRAIT ]}},
7994 members = {
8095 "message" : {"index" : 0 , "target" : SCHEMA_MESSAGE_EVENT },
8196 "payload" : {"index" : 1 , "target" : SCHEMA_PAYLOAD_EVENT },
82- "error" : {"index" : 2 , "target" : SCHEMA_ERROR_EVENT },
97+ "blobPayload" : {"index" : 2 , "target" : SCHEMA_BLOB_PAYLOAD_EVENT },
98+ "error" : {"index" : 3 , "target" : SCHEMA_ERROR_EVENT },
8399 },
84100)
85101
@@ -273,6 +289,57 @@ def serialize_members(self, serializer: ShapeSerializer):
273289 serializer .write_struct (SCHEMA_EVENT_STREAM .members ["payload" ], self .value )
274290
275291
292+ @dataclass
293+ class BlobPayloadEvent :
294+ header : str
295+ payload : bytes
296+
297+ def serialize (self , serializer : ShapeSerializer ):
298+ with serializer .begin_struct (SCHEMA_BLOB_PAYLOAD_EVENT ) as s :
299+ self .serialize_members (s )
300+
301+ def serialize_members (self , serializer : ShapeSerializer ) -> None :
302+ serializer .write_string (
303+ SCHEMA_BLOB_PAYLOAD_EVENT .members ["header" ], self .header
304+ )
305+ serializer .write_blob (
306+ SCHEMA_BLOB_PAYLOAD_EVENT .members ["payload" ], self .payload
307+ )
308+
309+ @classmethod
310+ def deserialize (cls , deserializer : ShapeDeserializer ) -> Self :
311+ kwargs : dict [str , Any ] = {}
312+
313+ def _consumer (schema : Schema , de : ShapeDeserializer ) -> None :
314+ match schema .expect_member_index ():
315+ case 0 :
316+ kwargs ["header" ] = de .read_string (
317+ SCHEMA_BLOB_PAYLOAD_EVENT .members ["header" ]
318+ )
319+ case 1 :
320+ kwargs ["payload" ] = de .read_blob (
321+ SCHEMA_BLOB_PAYLOAD_EVENT .members ["payload" ]
322+ )
323+ case _:
324+ raise SmithyException (f"Unexpected member schema: { schema } " )
325+
326+ deserializer .read_struct (schema = SCHEMA_BLOB_PAYLOAD_EVENT , consumer = _consumer )
327+ return cls (** kwargs )
328+
329+
330+ @dataclass
331+ class EventStreamBlobPayloadEvent :
332+ value : BlobPayloadEvent
333+
334+ def serialize (self , serializer : ShapeSerializer ):
335+ serializer .write_struct (SCHEMA_EVENT_STREAM , self )
336+
337+ def serialize_members (self , serializer : ShapeSerializer ):
338+ serializer .write_struct (
339+ SCHEMA_EVENT_STREAM .members ["blobPayload" ], self .value
340+ )
341+
342+
276343@dataclass
277344class ErrorEvent :
278345 code : ClassVar [str ] = "NoSuchResource"
@@ -326,7 +393,7 @@ def serialize_members(self, serializer: ShapeSerializer):
326393 raise SmithyException ("Unknown union variants may not be serialized." )
327394
328395
329- type EventStream = EventStreamMessageEvent | EventStreamPayloadEvent | EventStreamErrorEvent | EventStreamUnknownEvent
396+ type EventStream = EventStreamMessageEvent | EventStreamPayloadEvent | EventStreamBlobPayloadEvent | EventStreamErrorEvent | EventStreamUnknownEvent
330397
331398
332399class EventStreamDeserializer :
@@ -350,6 +417,11 @@ def _consumer(self, schema: Schema, de: ShapeDeserializer) -> None:
350417 self ._set_result (EventStreamPayloadEvent (PayloadEvent .deserialize (de )))
351418
352419 case 2 :
420+ self ._set_result (
421+ EventStreamBlobPayloadEvent (BlobPayloadEvent .deserialize (de ))
422+ )
423+
424+ case 3 :
353425 self ._set_result (EventStreamErrorEvent (ErrorEvent .deserialize (de )))
354426
355427 case _:
@@ -528,7 +600,21 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
528600 "header" : "header" ,
529601 ":content-type" : "text/plain" ,
530602 },
531- payload = b'"payload"' ,
603+ payload = b"payload" ,
604+ ),
605+ ),
606+ (
607+ EventStreamBlobPayloadEvent (
608+ BlobPayloadEvent (header = "header" , payload = b"\x07 beep\x07 " )
609+ ),
610+ EventMessage (
611+ headers = {
612+ ":message-type" : "event" ,
613+ ":event-type" : "blobPayload" ,
614+ "header" : "header" ,
615+ ":content-type" : "application/octet-stream" ,
616+ },
617+ payload = b"\x07 beep\x07 " ,
532618 ),
533619 ),
534620 (
0 commit comments