50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
|
|
|
|
from enum import Enum
|
|
from dataclasses import dataclass
|
|
from typing import Optional, Any
|
|
|
|
class ResultError(Enum):
|
|
"""Classified error categories."""
|
|
SUCCESS = "success"
|
|
NOT_SUPPORTED = "NOT_SUPPORTED"
|
|
INVALID_INPUT = "invalid_input"
|
|
MISSING_FILE = "missing_file"
|
|
MISSING_DEPENDENCY = "missing_dependency"
|
|
MISSING_DATA = "missing_data"
|
|
FILE_SYSTEM = "filesystem"
|
|
CONNECTION = "connection"
|
|
DATABASE = "database"
|
|
PERMISSION = "permission"
|
|
SUBSCRIPTION = "subscription"
|
|
PROCESS_GOT_KILLED = "process_got_killed"
|
|
PROCESS_WONT_START = "process_wont_start"
|
|
PROCESS_MISMATCH = "process_mismatch"
|
|
NMCLI = "nmcli_issues"
|
|
FIREWALL = "firewall"
|
|
CLIENT_DNS = "client_dns"
|
|
EXTERNAL_DNS = "external_dns"
|
|
INTERFACE = "interface"
|
|
TIMEOUT = "timeout"
|
|
INVALID_API_REPLY = "invalid_api_reply"
|
|
ENCRYPTION = "encryption"
|
|
LEAK_ISSUE = "leak_issue"
|
|
NEED_SYNC = "need_sync"
|
|
UNKNOWN = "unknown"
|
|
|
|
@dataclass
|
|
class Result():
|
|
valid: bool
|
|
goal_result: Optional[bool] = None
|
|
error_type: ResultError = ResultError.SUCCESS
|
|
data: Optional[Any] = None
|
|
message: Optional[str] = None
|
|
goal: Optional[str] = None
|
|
|
|
def user_message(self) -> str:
|
|
"""Human-readable error for the UI."""
|
|
messages = {
|
|
ResultError.SUCCESS: "Operation completed successfully.",
|
|
ResultError.UNKNOWN: f"Error: {self.message}",
|
|
}
|
|
return messages.get(self.error_type, "Unknown error")
|