#  _  __  
# | |/ /___ ___ _ __  ___ _ _ ®
# | ' </ -_) -_) '_ \/ -_) '_|
# |_|\_\___\___| .__/\___|_|
#              |_|            
#
# <NAME> 
# Contact: <EMAIL>
#

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class AuthenticationError(Error):
    """Exception raised with user fails authentication

    Attributes:
        message -- explanation of authentication error
    """

    def __init__(self, message):
        self.message = message

class CommunicationError(Error):
    """Exception raised with network issues

    Attributes:
        message -- explanation of communication error
    """

    def __init__(self, message):
        self.message = message


class KeeperApiError(CommunicationError):
    """Exception raised with failed Keeper API request
    """

    def __init__(self, result_code, message):
        CommunicationError.__init__(self, message)
        self.result_code = result_code

    def __str__(self):
        return self.message or self.result_code


class CryptoError(Error):
    """Exception raised with cryptography issues

    Attributes:
        message -- explanation of crypto error
    """

    def __init__(self, message):
        self.message = message


class CommandError(Error):
    def __init__(self, command, message):
        self.command = command
        self.message = message

#  _  __  
# | |/ /___ ___ _ __  ___ _ _ ®
# | ' </ -_) -_) '_ \/ -_) '_|
# |_|\_\___\___| .__/\___|_|
#              |_|            
#
# <NAME> 
# Contact: <EMAIL>
#

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class AuthenticationError(Error):
    """Exception raised with user fails authentication

    Attributes:
        message -- explanation of authentication error
    """

    def __init__(self, message):
        self.message = message

class CommunicationError(Error):
    """Exception raised with network issues

    Attributes:
        message -- explanation of communication error
    """

    def __init__(self, message):
        self.message = message


class KeeperApiError(CommunicationError):
    """Exception raised with failed Keeper API request
    """

    def __init__(self, result_code, message):
        CommunicationError.__init__(self, message)
        self.result_code = result_code

    def __str__(self):
        return self.message or self.result_code


class CryptoError(Error):
    """Exception raised with cryptography issues

    Attributes:
        message -- explanation of crypto error
    """

    def __init__(self, message):
        self.message = message


class CommandError(Error):
    def __init__(self, command, message):
        self.command = command
        self.message = message

#  _  __ # | |/ /___ ___ _ __  ___ _ _ ® # | ' </ -_) -_) '_ \/ -_) '_| # |_|\_\___\___| .__/\___|_| #              |_| # # <NAME> # Contact: <EMAIL> # Base class for exceptions in this module. Exception raised for errors in the input.      Attributes:         expression -- input expression in which the error occurred         message -- explanation of the error Exception raised with user fails authentication      Attributes:         message -- explanation of authentication error Exception raised with network issues      Attributes:         message -- explanation of communication error Exception raised with failed Keeper API request Exception raised with cryptography issues      Attributes:         message -- explanation of crypto error