# Copyright 2016 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Feedback request interface."""


class FeedbackRequestError(Exception):
    """An error during feedback request processing."""


class FeedbackRequest(object):
    """A abstract class for managing a single feedback request."""

    _TITLE_TEMPLATE = '%(desc)s request from %(dut)s (%(test)s)'

    def __init__(self, test, dut, desc):
        """Initializes the request object.

        @param test: The test name.
        @param dut: The DUT name.
        @param desc: A one-liner describing the essence of the request.
        """
        self.test = test
        self.dut = dut
        self.desc = desc


    def get_title(self):
        """Returns the request descriptive title.

        This method is used by the resuest multiplexer to obtain a list of
        pending request titles.

        @return: A short string describing the request and who made it.
        """
        return (self._TITLE_TEMPLATE %
                {'test': self.test, 'dut': self.dut, 'desc': self.desc})


    def execute(self):
        """Executes the feedback request.

        @return: The result of processing the request. This value varies
                 depending on the request type and is up to the invoking
                 delegate to evaluate and act upon.

        @raise FeedbackRequestError: Failed to execute the request.
        """
        raise NotImplementedError
