import traceback

from autotest_lib.tko import status_lib, utils as tko_utils


class parser(object):
    """
    Abstract parser base class. Provides a generic implementation of the
    standard parser interfaction functions. The derived classes must
    implement a state_iterator method for this class to be useful.
    """
    def start(self, job):
        """ Initialize the parser for processing the results of
        'job'."""
        # initialize all the basic parser parameters
        self.job = job
        self.finished = False
        self.line_buffer = status_lib.line_buffer()
        # create and prime the parser state machine
        self.state = self.state_iterator(self.line_buffer)
        self.state.next()


    def process_lines(self, lines):
        """ Feed 'lines' into the parser state machine, and return
        a list of all the new test results produced."""
        self.line_buffer.put_multiple(lines)
        try:
            return self.state.next()
        except StopIteration:
            msg = ("WARNING: parser was called to process status "
                   "lines after it was end()ed\n"
                   "Current traceback:\n" +
                   traceback.format_exc() +
                   "\nCurrent stack:\n" +
                   "".join(traceback.format_stack()))
            tko_utils.dprint(msg)
            return []


    def end(self, lines=[]):
        """ Feed 'lines' into the parser state machine, signal to the
        state machine that no more lines are forthcoming, and then
        return a list of all the new test results produced."""
        self.line_buffer.put_multiple(lines)
        # run the state machine to clear out the buffer
        self.finished = True
        try:
            return self.state.next()
        except StopIteration:
            msg = ("WARNING: parser was end()ed multiple times\n"
                   "Current traceback:\n" +
                   traceback.format_exc() +
                   "\nCurrent stack:\n" +
                   "".join(traceback.format_stack()))
            tko_utils.dprint(msg)
            return []


    @staticmethod
    def make_job(dir):
        """ Create a new instance of the job model used by the
        parser, given a results directory."""
        raise NotImplementedError


    def state_iterator(self, buffer):
        """ A generator method that implements the actual parser
        state machine. """
        raise NotImplementedError
