from __future__ import annotations
from typing import Any
class NautilusError(Exception):
def __init__(self, message: str, *, code: int | None = None, data: Any = None) -> None:
super().__init__(message)
self.code = code
self.data = data
class ProtocolError(NautilusError):
pass
class HandshakeError(NautilusError):
pass
class ValidationError(NautilusError):
pass
class QueryError(NautilusError):
pass
class DatabaseError(NautilusError):
pass
class ConnectionError(DatabaseError):
pass
class ConstraintViolationError(DatabaseError):
pass
class UniqueConstraintError(ConstraintViolationError):
pass
class ForeignKeyConstraintError(ConstraintViolationError):
pass
class CheckConstraintError(ConstraintViolationError):
pass
class NullConstraintError(ConstraintViolationError):
pass
class DeadlockError(DatabaseError):
pass
class SerializationError(DatabaseError):
pass
class QueryTimeoutError(DatabaseError):
pass
class NotFoundError(DatabaseError):
pass
class InternalError(NautilusError):
pass
class TransactionError(NautilusError):
pass
class TransactionTimeoutError(TransactionError):
pass
def error_from_code(code: int, message: str, data: Any = None) -> NautilusError:
if 1000 <= code < 2000:
return ValidationError(f"[{code}] {message}", code=code, data=data)
elif 2000 <= code < 3000:
return QueryError(f"[{code}] {message}", code=code, data=data)
elif code == 3001:
return ConnectionError(f"[{code}] {message}", code=code, data=data)
elif code == 3002:
return ConstraintViolationError(f"[{code}] {message}", code=code, data=data)
elif code == 3003:
return QueryTimeoutError(f"[{code}] {message}", code=code, data=data)
elif code == 3004:
return NotFoundError(f"[{code}] {message}", code=code, data=data)
elif code == 3005:
return UniqueConstraintError(f"[{code}] {message}", code=code, data=data)
elif code == 3006:
return ForeignKeyConstraintError(f"[{code}] {message}", code=code, data=data)
elif code == 3007:
return CheckConstraintError(f"[{code}] {message}", code=code, data=data)
elif code == 3008:
return NullConstraintError(f"[{code}] {message}", code=code, data=data)
elif code == 3009:
return DeadlockError(f"[{code}] {message}", code=code, data=data)
elif code == 3010:
return SerializationError(f"[{code}] {message}", code=code, data=data)
elif 3000 <= code < 4000:
return DatabaseError(f"[{code}] {message}", code=code, data=data)
elif code == 4002:
return TransactionTimeoutError(f"[{code}] {message}", code=code, data=data)
elif 4001 <= code <= 4004:
return TransactionError(f"[{code}] {message}", code=code, data=data)
elif 9000 <= code < 10000:
return InternalError(f"[{code}] {message}", code=code, data=data)
else:
return ProtocolError(f"[{code}] {message}", code=code, data=data)