from pyasn1.error import PyAsn1Error
from pysnmp.error import PySnmpError

class SmiError(PySnmpError, PyAsn1Error): pass
class MibOperationError(SmiError):
    def __init__(self, **kwargs): self.__outArgs = kwargs
    def __str__(self): return '%s(%s)' % (
        self.__class__.__name__, self.__outArgs
        )
    def __getitem__(self, key): return self.__outArgs[key]
    def __contains__(self, key): return key in self.__outArgs
    def get(self, key, defVal=None): return self.__outArgs.get(key, defVal)
    def keys(self): return self.__outArgs.keys()
    def update(self, d): self.__outArgs.update(d)
    
# Aligned with SNMPv2 PDU error-status
class GenError(MibOperationError): pass
class NoAccessError(MibOperationError): pass
class WrongTypeError(MibOperationError): pass
class WrongValueError(MibOperationError): pass
class NoCreationError(MibOperationError): pass
class InconsistentValueError(MibOperationError): pass
class ResourceUnavailableError(MibOperationError): pass
class CommitFailedError(MibOperationError): pass
class UndoFailedError(MibOperationError): pass
class AuthorizationError(MibOperationError): pass
class NotWritableError(MibOperationError): pass
class InconsistentNameError(MibOperationError): pass

# Aligned with SNMPv2 Var-Bind exceptions
class NoSuchObjectError(MibOperationError): pass
class NoSuchInstanceError(NoSuchObjectError): pass
class EndOfMibViewError(MibOperationError): pass

# Row management
class RowCreationWanted(MibOperationError): pass
class RowDestructionWanted(MibOperationError): pass
