Source code for libretro.drivers.message.logger

"""
A message driver that stores core messages and optionally logs them.

.. seealso::

    :mod:`libretro.api.message`
        Defines the message types this driver records.
"""

from collections.abc import Sequence
from copy import deepcopy
from logging import Logger
from typing import override

from libretro.api import LogLevel, MessageTarget, retro_message, retro_message_ext

from .driver import MessageDriver


[docs] class LoggerMessageDriver(MessageDriver): """ A :class:`.MessageDriver` that stores all messages in memory and optionally forwards them to a standard Python :class:`~logging.Logger`. """
[docs] def __init__(self, version: int = 1, logger: Logger | None = None): """ :param version: The message interface version to advertise (``0`` or ``1``). :param logger: An optional :class:`~logging.Logger` to write messages to. """ self._version = version self._logger = logger self._messages: list[retro_message] = [] self._message_exts: list[retro_message_ext] = []
@property @override def version(self) -> int: return self._version @property def messages(self) -> Sequence[retro_message]: """All basic messages received from the core, in order.""" return self._messages @property def message_exts(self) -> Sequence[retro_message_ext]: """All extended messages received from the core, in order.""" return self._message_exts
[docs] @override def set_message(self, message: retro_message | retro_message_ext | None) -> bool: match message: case retro_message(): self._messages.append(deepcopy(message)) if self._logger is not None: self._logger.info(message.msg) return True case retro_message_ext() if self._version >= 1: self._message_exts.append(deepcopy(message)) if self._logger is not None and message.target in ( MessageTarget.LOG, MessageTarget.ALL, ): self._logger.log(LogLevel(message.level).logging_level, message.msg) return True case _: return False
__all__ = [ "LoggerMessageDriver", ]