import binascii
import exceptions

# this is a dict of {"exceptions.<exception class name>": exception class} items used to raise
# remote built-in exceptions locally
BUILTIN_EXCEPTIONS = {
    "exceptions.%s" % e: getattr(exceptions, e) for e in dir(exceptions) if not e.startswith("_")
}


class DecodeError(Exception):
    """
    Should be raised by an C{Encoding} implementation if decode operation
    fails
    """
    pass


class BucketFull(Exception):
    """
    Raised when the bucket is full
    """
    pass


class UnknownRemoteException(Exception):
    pass


class TimeoutError(Exception):
    """ Raised when a RPC times out """

    def __init__(self, remote_contact_id):
        # remote_contact_id is a binary blob so we need to convert it
        # into something more readable
        msg = 'Timeout connecting to {}'.format(binascii.hexlify(remote_contact_id))
        Exception.__init__(self, msg)
        self.remote_contact_id = remote_contact_id