Skip to content

Commit 264b6ec

Browse files
committed
Fix UnionModel handling on receiver side
1 parent 6ab625e commit 264b6ec

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

src/asyncapi_python/amqp/endpoint/receiver.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from .base import AbstractEndpoint, EndpointParams
2323
from ..error import Rejection, BadRequestRejection
2424
from ..operation import Operation
25+
from ..utils import UnionModel
2526
from aio_pika.abc import AbstractIncomingMessage, AbstractRobustQueue
2627

2728

@@ -80,6 +81,9 @@ async def _consumer(self, message: AbstractIncomingMessage):
8081
def _decode_payload(self, message: AbstractIncomingMessage) -> I:
8182
try:
8283
payload: I = self._params.decode(message.body, self._op.message_type)
84+
# This trick is used to support union types in receivers
85+
if isinstance(payload, UnionModel):
86+
payload = cast(I, payload.root)
8387
except ValidationError as e:
8488
raise BadRequestRejection(e)
8589
return payload

src/asyncapi_python/amqp/utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
U = TypeVar("U")
2222

2323

24+
class UnionModel(RootModel): ...
25+
26+
2427
def encode_message(message: T) -> bytes:
2528
return message.model_dump_json().encode()
2629

@@ -30,6 +33,6 @@ def decode_message(message: bytes, schema: type[T]) -> T:
3033

3134

3235
@cache
33-
def union_model(types: tuple[type[U], ...]) -> type[RootModel[U]]:
36+
def union_model(types: tuple[type[U], ...]) -> type[UnionModel[U]]:
3437
UnionType = Union.__getitem__(types)
35-
return RootModel[UnionType] # type: ignore
38+
return UnionModel[UnionType] # type: ignore

0 commit comments

Comments
 (0)