File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2222from .base import AbstractEndpoint , EndpointParams
2323from ..error import Rejection , BadRequestRejection
2424from ..operation import Operation
25+ from ..utils import UnionModel
2526from 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
Original file line number Diff line number Diff line change 2121U = TypeVar ("U" )
2222
2323
24+ class UnionModel (RootModel ): ...
25+
26+
2427def 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
You can’t perform that action at this time.
0 commit comments