Skip to content

Commit d40868a

Browse files
committed
Address PR review: refactor unknown event handling
1 parent e8f84ce commit d40868a

4 files changed

Lines changed: 27 additions & 37 deletions

File tree

codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/UnionGenerator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,6 @@ private void generateDeserializer() {
144144
writer.addImport("smithy_core.deserializers", "ShapeDeserializer");
145145
writer.addImport("smithy_core.exceptions", "SerializationError");
146146

147-
// TODO: add in unknown handling
148-
149147
var symbol = symbolProvider.toSymbol(shape);
150148
var deserializerSymbol = symbol.expectProperty(SymbolProperties.DESERIALIZER);
151149
var schemaSymbol = symbol.expectProperty(SymbolProperties.SCHEMA);
@@ -169,7 +167,7 @@ def _consumer(self, schema: Schema, de: ShapeDeserializer) -> None:
169167
${4C|}
170168
case _:
171169
logger.debug("Unexpected member schema: %s", schema)
172-
self._set_result($5L(tag=schema.member_name or ""))
170+
self._set_result($5L(tag=schema.expect_member_name()))
173171
174172
def _set_result(self, value: $2T) -> None:
175173
if self._result is not None:

packages/smithy-aws-event-stream/src/smithy_aws_event_stream/_private/deserializers.py

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
SpecificShapeDeserializer,
1111
)
1212
from smithy_core.schemas import Schema
13-
from smithy_core.shapes import ShapeID, ShapeType
13+
from smithy_core.shapes import ShapeType
1414
from smithy_core.traits import EventHeaderTrait
1515
from smithy_core.utils import expect_type
1616

@@ -50,34 +50,11 @@ def read_struct(
5050
message_deserializer = self._create_deserializer(schema, headers)
5151
message_deserializer.read_struct(schema, consumer)
5252
else:
53-
member_schema = schema.members.get(member_name)
54-
if member_schema is None:
55-
# Unknown event type. Call the consumer with a
56-
# schema that carries the event type name as
57-
# member_name and a member_index of -1 so the
58-
# generated default branch constructs the unknown
59-
# variant with the correct tag.
60-
logger.debug("Unknown event type: %s", member_name)
61-
62-
_UNKNOWN_TARGET = Schema(
63-
id=ShapeID("smithy.unknown#Unknown"),
64-
shape_type=ShapeType.STRUCTURE,
65-
)
66-
unknown_schema = Schema(
67-
id=ShapeID(f"smithy.unknown#Unknown${member_name}"),
68-
shape_type=ShapeType.STRUCTURE,
69-
member_target=_UNKNOWN_TARGET,
70-
member_index=-1,
71-
)
72-
consumer(
73-
unknown_schema,
74-
self._payload_codec.create_deserializer(b"{}"),
75-
)
76-
else:
77-
message_deserializer = self._create_deserializer(
78-
member_schema, headers
79-
)
80-
consumer(member_schema, message_deserializer)
53+
member_schema = self._resolve_member_schema(schema, member_name)
54+
message_deserializer = self._create_deserializer(
55+
member_schema, headers
56+
)
57+
consumer(member_schema, message_deserializer)
8158
case "exception":
8259
member_name = expect_type(str, headers[":exception-type"])
8360
member_schema = schema.members[member_name]
@@ -94,6 +71,21 @@ def read_struct(
9471
case _:
9572
raise EventError(f"Unknown event structure: {self._event}")
9673

74+
def _resolve_member_schema(self, schema: Schema, member_name: str) -> Schema:
75+
if member_schema := schema.members.get(member_name):
76+
return member_schema
77+
78+
logger.debug(
79+
"Received unmodeled event stream member %s for union %s",
80+
member_name,
81+
schema.id,
82+
)
83+
return Schema.member(
84+
id=schema.id.with_member(member_name),
85+
target=schema,
86+
index=-1,
87+
)
88+
9789
def _create_deserializer(
9890
self, schema: Schema, headers: HEADERS_DICT
9991
) -> ShapeDeserializer:

packages/smithy-aws-event-stream/tests/unit/_private/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ def _consumer(self, schema: Schema, de: ShapeDeserializer) -> None:
429429
self._set_result(EventStreamErrorEvent(ErrorEvent.deserialize(de)))
430430

431431
case _:
432-
self._set_result(EventStreamUnknown(tag=schema.member_name or ""))
432+
self._set_result(EventStreamUnknown(tag=schema.expect_member_name()))
433433

434434
def _set_result(self, value: EventStream) -> None:
435435
if self._result is not None:
@@ -636,11 +636,11 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
636636

637637

638638
UNKNOWN_EVENT_CASE = (
639-
EventStreamUnknown(tag="intermediateGroupEvent"),
639+
EventStreamUnknown(tag="unmodeledEvent"),
640640
EventMessage(
641641
headers={
642642
":message-type": "event",
643-
":event-type": "intermediateGroupEvent",
643+
":event-type": "unmodeledEvent",
644644
":content-type": "application/json",
645645
},
646646
payload=b"{}",

packages/smithy-aws-event-stream/tests/unit/_private/test_deserializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def test_deserialize_unknown_event_type():
133133
message = EventMessage(
134134
headers={
135135
":message-type": "event",
136-
":event-type": "intermediateGroupEvent",
136+
":event-type": "unmodeledEvent",
137137
":content-type": "application/json",
138138
},
139139
payload=b"{}",
@@ -143,4 +143,4 @@ def test_deserialize_unknown_event_type():
143143
deserializer = EventDeserializer(event=source, payload_codec=JSONCodec())
144144
result = EventStreamDeserializer().deserialize(deserializer)
145145
assert isinstance(result, EventStreamUnknown)
146-
assert result.tag == "intermediateGroupEvent"
146+
assert result.tag == "unmodeledEvent"

0 commit comments

Comments
 (0)