#!/usr/bin/env python

r"""
This module is the python counterpart to run_keyword.robot.
"""

import gen_print as gp
import gen_robot_print as grp
import gen_robot_valid as grv

from robot.libraries.BuiltIn import BuiltIn


###############################################################################
def main_py():

    r"""
    Do main program processing.
    """

    setup()

    keyword_string = BuiltIn().get_variable_value("${keyword_string}")
    lib_file_path = BuiltIn().get_variable_value("${lib_file_path}")

    cmd_buf = keyword_string.split("  ")

    if lib_file_path != "":
        # We don't want global variable getting changed when an import is done
        # so we'll save it and restore it.
        quiet = int(BuiltIn().get_variable_value("${quiet}"))
        if lib_file_path.endswith(".py"):
            grp.rdprint_issuing("import_library(\"" + lib_file_path + "\")")
            BuiltIn().import_library(lib_file_path)
        else:
            grp.rdprint_issuing("import_resource(\"" + lib_file_path + "\")")
            BuiltIn().import_resource(lib_file_path)
        BuiltIn().set_global_variable("${quiet}", quiet)

    error_message = grp.sprint_error_report("Keyword \"" + cmd_buf[0] +
                                            "\" does not exist.\n")
    BuiltIn().keyword_should_exist(cmd_buf[0], msg=error_message)

    grp.rqprint_issuing_keyword(cmd_buf)
    status, output = BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
    if status != "PASS":
        error_message = grp.sprint_error_report("\"" + cmd_buf[0] +
                                                "\" failed with the" +
                                                " following error:\n" + output)
        if not quiet:
            grp.rprint(error_message, 'STDERR')
        BuiltIn().fail(error_message)

    if output is not None:
        grp.rprint(output)

###############################################################################


###############################################################################
def setup():

    r"""
    Do general program setup tasks.
    """

    grp.rqprintn()

    validate_parms()

    grp.rqprint_pgm_header()

###############################################################################


###############################################################################
def validate_parms():

    r"""
    Validate all program parameters.
    """

    grv.rvalid_value("keyword_string")

    return True

###############################################################################


###############################################################################
def program_teardown():

    r"""
    Clean up after this program.
    """

    grp.rqprint_pgm_footer()

###############################################################################
