1#[derive(Default, serde::Deserialize, Debug, Clone)]
4pub enum ErrorCode {
6 #[default]
8 NotSet = 0,
9
10 WebSocketFailedToConnect,
12
13 WebSocketErrorEncodingMessage,
15
16 WebSocketErrorDecodingMessage,
18
19 WebSocketUnknownMessageReceived,
21
22 WebSocketUnknownBinaryMessageReceived,
24
25 WebSocketError,
27
28 WebSocketClosed,
30
31 WebSocketErrorClosing,
33
34 FileNotSelected,
36
37 FileErrorReadingFile,
39
40 FileNotReady,
42
43 FileInvalidEncoding,
45
46 HexeDecodingError,
48
49 EndOfFile,
51
52 FileParsing,
54
55 RequestError,
57
58 ParsingLayerNotImplemented,
60}
61
62impl std::fmt::Display for ErrorCode {
63 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64 let str = match self {
66 Self::WebSocketFailedToConnect => "WebSocket: Failed to connect",
67 Self::WebSocketErrorEncodingMessage => "WebSocket: Error encoding message",
68 Self::WebSocketErrorDecodingMessage => "WebSocket: Error decoding message",
69 Self::WebSocketUnknownMessageReceived => "WebSocket: Unknown message received",
70 Self::WebSocketUnknownBinaryMessageReceived => "WebSocket: Unknown binary message received",
71 Self::WebSocketError => "WebSocket: Error",
72 Self::WebSocketClosed => "WebSocket: Closed",
73 Self::WebSocketErrorClosing => "WebSocket: Error closing",
74 Self::FileNotSelected => "File: No file selected",
75 Self::FileErrorReadingFile => "File: Error reading file",
76 Self::FileNotReady => "File: Not ready",
77 Self::FileInvalidEncoding => "File: Invalid encoding (wrong UTF-8)",
78 Self::NotSet => "Error code not set, please create an issue",
79 Self::HexeDecodingError => "Hexe decoding error",
80 Self::EndOfFile => "End of File",
81 Self::FileParsing => "File: Parsing error",
82 Self::RequestError => "Request error",
83 Self::ParsingLayerNotImplemented => "Parsing layer not implemented",
84 };
85 write!(f, "{str}")
86 }
87}
88
89impl ErrorCode {
90 pub fn is_recoverable(&self) -> bool {
92 !matches!(self, Self::FileInvalidEncoding | Self::WebSocketClosed)
93 }
94}
95
96#[derive(serde::Deserialize, Debug, Default, Clone)]
97pub struct TramexError {
99 pub message: String,
101
102 pub debug: String,
104
105 code: ErrorCode,
107}
108
109impl TramexError {
110 pub fn new(message: String, code: ErrorCode) -> Self {
112 log::debug!("Error: {} - {}\n{}", code, message, std::backtrace::Backtrace::capture());
113 Self {
114 message,
115 code,
116 debug: String::new(),
117 }
118 }
119
120 pub fn new_with_line(message: String, code: ErrorCode, debug: String) -> Self {
122 Self { message, code, debug }
123 }
124
125 pub fn is_recoverable(&self) -> bool {
127 self.code.is_recoverable()
128 }
129
130 pub fn get_msg(&self) -> String {
132 format!("[{}] {}", self.code, self.message)
133 }
134
135 pub fn get_code(&self) -> ErrorCode {
137 self.code.clone()
138 }
139}
140
141#[macro_export]
143macro_rules! tramex_error {
144 ($msg:expr, $code:expr) => {
145 TramexError::new_with_line($msg, $code, format!("{}:{}", file!(), line!()))
146 };
147}