Source code for mersal._activation.handler_activator
from __future__ import annotations
from collections.abc import Callable, Sequence
from typing import TYPE_CHECKING, Protocol, TypeAlias, TypeVar
from mersal.handlers import MessageHandler
from mersal.pipeline import MessageContext
# Define a type variable for messages
MessageT = TypeVar("MessageT")
#: A factory function that creates message handlers
HandlerFactory: TypeAlias = Callable[
[MessageContext, "Mersal"],
MessageHandler[MessageT],
]
if TYPE_CHECKING:
from mersal.core.app import Mersal
from mersal.transport import TransactionContext
__all__ = ("HandlerActivator",)
[docs]
class HandlerActivator(Protocol):
"""Protocol defining the interface for activating message handlers.
The HandlerActivator is responsible for registering message handlers
and returning the appropriate handlers for a given message type during
message processing.
"""
[docs]
async def get_handlers(
self,
message: MessageT,
transaction_context: TransactionContext,
) -> Sequence[MessageHandler[MessageT]]:
"""Retrieve handlers for the given message.
Args:
message: The message to get handlers for
transaction_context: The current transaction context
Returns:
A sequence of message handlers that can process the message
"""
...
[docs]
def register(
self,
message_type: type[MessageT],
factory: HandlerFactory[MessageT],
) -> HandlerActivator:
"""Register a handler factory for a specific message type.
Args:
message_type: The type of message to register a handler for
factory: A factory function that creates a message handler
Returns:
The handler activator instance for method chaining
"""
...
@property
def registered_message_types(self) -> set[type]:
"""Get the set of message types that have registered handlers.
Returns:
A set containing all registered message types
"""
...
@property
def app(self) -> Mersal: ...
@app.setter
def app(self, value: Mersal) -> None: ...