"""Exception hierarchy for the PadRelay"""
from typing import Any, Optional
[docs]
class GamepadBridgeError(Exception):
"""Base exception for bridge errors"""
[docs]
def __init__(self, message: str = "An error occurred in the PadRelay", details: Optional[Any] = None) -> None:
self.message = message
self.details = details
super().__init__(self.message)
def __str__(self) -> str:
if self.details:
return f"{self.message} - Details: {self.details}"
return self.message
[docs]
class ProtocolError(GamepadBridgeError):
"""Protocol-related error"""
[docs]
def __init__(self, message: str = "Protocol error", details: Optional[Any] = None, protocol_version: Optional[str] = None) -> None:
self.protocol_version = protocol_version
super().__init__(message, details)
def __str__(self) -> str:
base_str = super().__str__()
if self.protocol_version:
return f"{base_str} (Protocol version: {self.protocol_version})"
return base_str
[docs]
class AuthenticationError(GamepadBridgeError):
"""Authentication failed"""
[docs]
def __init__(self, message: str = "Authentication failed", details: Optional[Any] = None, addr: Optional[str] = None) -> None:
self.addr = addr
super().__init__(message, details)
def __str__(self) -> str:
base_str = super().__str__()
if self.addr:
return f"{base_str} (Client: {self.addr})"
return base_str
[docs]
class ConnectionError(GamepadBridgeError):
"""Connection related error"""
[docs]
def __init__(self, message: str = "Connection error", details: Optional[Any] = None, addr: Optional[str] = None, reconnect_attempt: Optional[int] = None) -> None:
self.addr = addr
self.reconnect_attempt = reconnect_attempt
super().__init__(message, details)
def __str__(self) -> str:
base_str = super().__str__()
if self.addr:
base_str = f"{base_str} (Remote: {self.addr})"
if self.reconnect_attempt is not None:
base_str = f"{base_str} (Reconnect attempt: {self.reconnect_attempt})"
return base_str
[docs]
class ConfigurationError(GamepadBridgeError):
"""Configuration problem"""
[docs]
def __init__(self, message: str = "Configuration error", details: Optional[Any] = None, config_file: Optional[str] = None, setting: Optional[str] = None) -> None:
self.config_file = config_file
self.setting = setting
super().__init__(message, details)
def __str__(self) -> str:
base_str = super().__str__()
if self.config_file:
base_str = f"{base_str} (File: {self.config_file})"
if self.setting:
base_str = f"{base_str} (Setting: {self.setting})"
return base_str