#!/usr/bin/env python3

exception_classes = {}

def _collect_exception_class(c):
    """
        Decorator that collects exception classes for parsing error codes.
    """
    exception_classes[c.__name__] = c
    return c


class OMResponseException(Exception):
    def __init__(self, response, msg=None):
        self.response = response
        if msg is None:
            msg = self.response.info
        super().__init__(msg)


@_collect_exception_class
class EAreaFull(OMResponseException):
    pass


@_collect_exception_class
class EAuth(OMResponseException):
    pass


@_collect_exception_class
class EDectRegDomainInvalid(OMResponseException):
    pass


@_collect_exception_class
class EEncryptNotAllowed(OMResponseException):
    pass


@_collect_exception_class
class EExist(OMResponseException):
    pass


@_collect_exception_class
class EFailed(OMResponseException):
    pass


@_collect_exception_class
class EForbidden(OMResponseException):
    pass


@_collect_exception_class
class EInProgress(OMResponseException):
    pass


@_collect_exception_class
class EInval(OMResponseException):
    def __init__(self, response):
        super().__init__(response, response.bad)


@_collect_exception_class
class EInvalidChars(OMResponseException):
    pass


@_collect_exception_class
class ELicense(OMResponseException):
    pass


@_collect_exception_class
class ELicenseFile(OMResponseException):
    pass


@_collect_exception_class
class ELicenseWrongInstallId(OMResponseException):
    pass


@_collect_exception_class
class EMissing(OMResponseException):
    def __init__(self, response):
        super().__init__(response, response.bad)


@_collect_exception_class
class ENoEnt(OMResponseException):
    pass


@_collect_exception_class
class ENoMem(OMResponseException):
    pass


@_collect_exception_class
class EPerm(OMResponseException):
    pass


@_collect_exception_class
class EPwEmpty(OMResponseException):
    pass


@_collect_exception_class
class EPwSimilarToHost(OMResponseException):
    pass


@_collect_exception_class
class EPwSimilarToName(OMResponseException):
    pass


@_collect_exception_class
class EPwTooManySimilarChars(OMResponseException):
    pass


@_collect_exception_class
class EPwTooShort(OMResponseException):
    pass


@_collect_exception_class
class EPwTooSimilar(OMResponseException):
    pass


@_collect_exception_class
class EPwTooWeak(OMResponseException):
    pass


@_collect_exception_class
class EPwUnchanged(OMResponseException):
    pass


@_collect_exception_class
class ETooLong(OMResponseException):
    def __init__(self, response):
        super().__init__(response, response.bad + ", maximum of " + str(response.maxLen))


@_collect_exception_class
class EWlanRegDomainInvalid(OMResponseException):
    pass