# @GPL_HEADER_START
# Use of the RAVE and related source code is subject to the terms
# of the following licenses:
# 
# GNU Public License (GPL) Rights pursuant to Version 2, June 1991
# Government Purpose License Rights (GPLR) pursuant to DFARS 252.225-7013
# 
# NO WARRANTY
# 
# ANY INFORMATION, MATERIALS, SERVICES, INTELLECTUAL PROPERTY OR OTHER
# PROPERTY OR RIGHTS GRANTED OR PROVIDED BY CARNEGIE MELLON UNIVERSITY
# PURSUANT TO THIS LICENSE (HEREINAFTER THE "DELIVERABLES") ARE ON AN
# "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
# KIND, EITHER EXPRESS OR IMPLIED AS TO ANY MATTER INCLUDING, BUT NOT
# LIMITED TO, WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE,
# MERCHANTABILITY, INFORMATIONAL CONTENT, NONINFRINGEMENT, OR ERROR-FREE
# OPERATION. CARNEGIE MELLON UNIVERSITY SHALL NOT BE LIABLE FOR INDIRECT,
# SPECIAL OR CONSEQUENTIAL DAMAGES, SUCH AS LOSS OF PROFITS OR INABILITY
# TO USE SAID INTELLECTUAL PROPERTY, UNDER THIS LICENSE, REGARDLESS OF
# WHETHER SUCH PARTY WAS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
# LICENSEE AGREES THAT IT WILL NOT MAKE ANY WARRANTY ON BEHALF OF
# CARNEGIE MELLON UNIVERSITY, EXPRESS OR IMPLIED, TO ANY PERSON
# CONCERNING THE APPLICATION OF OR THE RESULTS TO BE OBTAINED WITH THE
# DELIVERABLES UNDER THIS LICENSE.
# 
# Licensee hereby agrees to defend, indemnify, and hold harmless Carnegie
# Mellon University, its trustees, officers, employees, and agents from
# all claims or demands made against them (and any related losses,
# expenses, or attorney's fees) arising out of, or relating to Licensee's
# and/or its sub licensees' negligent use or willful misuse of or
# negligent conduct or willful misconduct regarding the Software,
# facilities, or other rights or assistance granted by Carnegie Mellon
# University under this License, including, but not limited to, any
# claims of product liability, personal injury, death, damage to
# property, or violation of any laws or regulations.
# 
# Carnegie Mellon University Software Engineering Institute authored
# documents are sponsored by the U.S. Department of Defense under
# Contract F19628-00-C-0003. Carnegie Mellon University retains
# copyrights in all material produced under this contract. The U.S.
# Government retains a non-exclusive, royalty-free license to publish or
# reproduce these documents, or allow others to do so, for U.S.
# Government purposes only pursuant to the copyright license under the
# contract clause at 252.227.7013.
# 
# @GPL_HEADER_END
#
# Exceptions
#

import traceback
import sys

class RaveException(Exception):
    """Base class for RAVE exceptions."""
    pass

class RaveNestedException(RaveException):
    """An exception wrapping another exception."""
    def __init__(self, msg, exc_info):
        self.exc_info =  exc_info
        RaveException.__init__(self, msg)

    def nested_tb_list(self):
        try:
            return traceback.format_exception(*self.exc_info)
        except:
            return ["[Couldn't print traceback information]"]

    def nested_tb(self):
        try:
            return ''.join(traceback.format_exception(*self.exc_info))
        except:
            return "[Couldn't print traceback information]"


class ConfigurationError(RaveException):
    """Problem with RAVE configuration."""
    pass

class IllegalTypemap(ConfigurationError):
    """The typemap is improperly specified."""
    pass
class TypemapTypeError(IllegalTypemap):
    """Couldn't reconcile typemap with function signature."""
    def __init__(self, msg):
        msg = ("Couldn't reconcile typemap with "
               "function signature: %s" % msg)
        ConfigurationError.__init__(self, msg)

class IncompleteCacheError(ConfigurationError):
    """RAVE cache hasn't been completely created."""
    def __init__(self, root, msg=None):
        if msg is None:
            msg = "Cache in '%s' is corrupt, " \
                  "incomplete or an outdated version" % root
        ConfigurationError.__init__(self, msg)
        self.root_dir = root


class ExportError(RaveException):
    "Problem with __export__ in a plugin module."
    pass

class NoSuchOperation(RaveException):
    "An Operation was requested that does not exist."
    msgformat = "No such operation '%s'"
    def __init__(self, ns):
        RaveException.__init__(self, self.msgformat % ns)

class NoSuchNamespace(NoSuchOperation):
    "Someone requested a non-existant namespace."
    msgformat = "No such namespace '%s'"

class NoSuchModule(NoSuchOperation):
    "A module was requested that does not exist"
    msgformat = "No such module '%s'"

class NamespaceLoadError(RaveNestedException):
    "A module couldn't be loaded."
    def __init__(self, modname, exc_info):
        errmsg = "Couldn't load namespace '%s': (%s: %s)" % (
            modname, exc_info[0], exc_info[1])
        RaveNestedException.__init__(self, errmsg, exc_info)

class ParameterError(RaveException):
    "There was a problem with the parameters passed into a function."
    pass

class TypeMismatch(ParameterError):
    "Attempt to coerce parameter into uncoercable type."
    pass

class DecoratorError(RaveException):
    "Problem in one of the RAVE decorators."
    pass

class CacheError(RaveException):
    "Problem in the RAVE cache."
    pass

class ModuleRemovedError(RaveException):
    """
    A module previously loaded by a Library has been removed in the filesystem. The
    enclosed message is the a tuple of the name of the (now-missing) module and its
    (now-nonexistant) path.
    """
    pass
