# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.


class MessageHandler:
    """A message handler providing message handling facilities to
    classes derived from BaseHandler and BaseFormatter. This is a
    composition class, to ensure handlers and formatters remain separate.

    :param inner: A handler-like callable that may receive messages
                  from a log user.
    """

    def __init__(self):
        self.message_handlers = {}
        self.wrapped = []

    def register_message_handlers(self, topic, handlers):
        self.message_handlers[topic] = handlers

    def handle_message(self, topic, cmd, *args):
        """Handles a message for the given topic by calling a subclass-defined
        callback for the command.

        :param topic: The topic of the broadcasted message. Handlers opt-in to
                      receiving messages by identifying a topic when calling
                      register_message_handlers.
        :param command: The command to issue. This is a string that corresponds
                        to a callback provided by the target.
        :param arg: Arguments to pass to the identified message callback, if any.
        """
        rv = []
        if topic in self.message_handlers and cmd in self.message_handlers[topic]:
            rv.append(self.message_handlers[topic][cmd](*args))
        if self.wrapped:
            for inner in self.wrapped:
                rv.extend(inner.handle_message(topic, cmd, *args))
        return rv
