__all__ = ["CommandHandler", "CommandHandlers"] from collections.abc import Iterator from typing import Never from argenta.app.protocols import HandlerFunc from argenta.command import Command from argenta.response import Response class CommandHandler: def __init__(self, handler_as_func: HandlerFunc, handled_command: Command): """ Private. Entity of the model linking the handler and the command being processed :param handler: the handler being called :param handled_command: the command being processed """ self.handler_as_func: HandlerFunc = handler_as_func self.handled_command: Command = handled_command def handling(self, response: Response) -> None: """ Private. Direct processing of an input command :param response: the entity of response: various groups of flags and status of response :return: None """ self.handler_as_func(response) class CommandHandlers: def __init__(self, command_handlers: tuple[CommandHandler] | tuple[Never, ...] = tuple()): """ Private. The model that unites all CommandHandler of the routers :param command_handlers: list of CommandHandlers for register """ self.command_handlers: list[CommandHandler] = list(command_handlers) if command_handlers else [] self.paired_command_handler_trigger: dict[str, CommandHandler] = {x.handled_command.trigger: x for x in command_handlers} def add_handler(self, command_handler: CommandHandler) -> None: """ Private. Adds a CommandHandler to the list of CommandHandlers :param command_handler: CommandHandler to be added :return: None """ self.command_handlers.append(command_handler) self.paired_command_handler_trigger[command_handler.handled_command.trigger.lower()] = command_handler for alias in command_handler.handled_command.aliases: self.paired_command_handler_trigger[alias.lower()] = command_handler def get_command_handler_by_trigger(self, trigger: str) -> CommandHandler | None: return self.paired_command_handler_trigger.get(trigger) def __iter__(self) -> Iterator[CommandHandler]: return iter(self.command_handlers)