Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
error_codes.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
25#pragma once
26
27#include <string>
28#include <string_view>
29
30namespace kcenon::common {
31namespace error {
32
37enum class category : int {
38 success = 0,
39 common = -1,
40 thread_system = -100,
41 logger_system = -200,
42 monitoring_system = -300,
43 container_system = -400,
44 database_system = -500,
45 network_system = -600,
46 pacs_system = -700,
47};
48
53namespace codes {
54
55// ============================================================================
56// Common Error Codes (-1 to -99)
57// ============================================================================
58namespace common_errors {
59 constexpr int success = 0;
60 constexpr int invalid_argument = -1;
61 constexpr int not_found = -2;
62 constexpr int permission_denied = -3;
63 constexpr int timeout = -4;
64 constexpr int cancelled = -5;
65 constexpr int not_initialized = -6;
66 constexpr int already_exists = -7;
67 constexpr int out_of_memory = -8;
68 constexpr int io_error = -9;
69 constexpr int network_error = -10;
70 constexpr int registry_frozen = -11;
71 constexpr int internal_error = -99;
72
73 // DI (dependency injection) errors (-50 to -59)
74 constexpr int di_service_not_registered = -50;
75 constexpr int di_circular_dependency = -51;
76 constexpr int di_already_registered = -52;
77 constexpr int di_factory_error = -53;
78 constexpr int di_invalid_lifetime = -54;
79 constexpr int di_scoped_from_root = -55;
80} // namespace common_errors
81
82// ============================================================================
83// thread_system Error Codes (-100 to -199)
84// ============================================================================
85namespace thread_system {
86 constexpr int base = static_cast<int>(category::thread_system);
87
88 // Pool errors (-100 to -119)
89 constexpr int pool_full = base - 0;
90 constexpr int pool_shutdown = base - 1;
91 constexpr int pool_not_started = base - 2;
92 constexpr int invalid_pool_size = base - 3;
93
94 // Worker errors (-120 to -139)
95 constexpr int worker_failed = base - 20;
96 constexpr int worker_not_found = base - 21;
97 constexpr int worker_busy = base - 22;
98
99 // Job errors (-140 to -159)
100 constexpr int job_rejected = base - 40;
101 constexpr int job_timeout = base - 41;
102 constexpr int job_cancelled = base - 42;
103 constexpr int invalid_job = base - 43;
104
105 // Queue errors (-160 to -179)
106 constexpr int queue_full = base - 60;
107 constexpr int queue_empty = base - 61;
108 constexpr int queue_stopped = base - 62;
109} // namespace thread_system
110
111// ============================================================================
112// logger_system Error Codes (-200 to -299)
113// ============================================================================
114namespace logger_system {
115 constexpr int base = static_cast<int>(category::logger_system);
116
117 // File errors (-200 to -219)
118 constexpr int file_open_failed = base - 0;
119 constexpr int file_write_failed = base - 1;
120 constexpr int file_close_failed = base - 2;
121 constexpr int file_rotation_failed = base - 3;
122 constexpr int file_permission_denied = base - 4;
123
124 // Writer errors (-220 to -239)
125 constexpr int writer_not_initialized = base - 20;
126 constexpr int writer_stopped = base - 21;
127 constexpr int writer_full = base - 22;
128 constexpr int async_writer_failed = base - 23;
129
130 // Format errors (-240 to -259)
131 constexpr int invalid_format = base - 40;
132 constexpr int format_error = base - 41;
133
134 // Filter errors (-260 to -279)
135 constexpr int invalid_filter = base - 60;
136 constexpr int filter_rejected = base - 61;
137} // namespace logger_system
138
139// ============================================================================
140// monitoring_system Error Codes (-300 to -399)
141// ============================================================================
143 constexpr int base = static_cast<int>(category::monitoring_system);
144
145 // Metric errors (-300 to -319)
146 constexpr int metric_not_found = base - 0;
147 constexpr int invalid_metric_type = base - 1;
148 constexpr int metric_collection_failed = base - 2;
149
150 // Storage errors (-320 to -339)
151 constexpr int storage_full = base - 20;
152 constexpr int storage_error = base - 21;
153
154 // Event errors (-340 to -359)
155 constexpr int event_publish_failed = base - 40;
156 constexpr int event_subscribe_failed = base - 41;
157 constexpr int invalid_event_type = base - 42;
158
159 // Profiler errors (-360 to -379)
160 constexpr int profiler_not_enabled = base - 60;
161 constexpr int profiler_error = base - 61;
162} // namespace monitoring_system
163
164// ============================================================================
165// container_system Error Codes (-400 to -499)
166// ============================================================================
168 constexpr int base = static_cast<int>(category::container_system);
169
170 // Value errors (-400 to -419)
171 constexpr int value_type_mismatch = base - 0;
172 constexpr int invalid_value_type = base - 1;
173 constexpr int value_conversion_failed = base - 2;
174
175 // Serialization errors (-420 to -439)
176 constexpr int serialization_failed = base - 20;
177 constexpr int deserialization_failed = base - 21;
178 constexpr int invalid_format = base - 22;
179
180 // Memory pool errors (-440 to -459)
181 constexpr int pool_exhausted = base - 40;
182 constexpr int allocation_failed = base - 41;
183 constexpr int invalid_allocation_size = base - 42;
184
185 // Container errors (-460 to -479)
186 constexpr int key_not_found = base - 60;
187 constexpr int duplicate_key = base - 61;
188 constexpr int container_full = base - 62;
189} // namespace container_system
190
191// ============================================================================
192// database_system Error Codes (-500 to -599)
193// ============================================================================
195 constexpr int base = static_cast<int>(category::database_system);
196
197 // Connection errors (-500 to -519)
198 constexpr int connection_failed = base - 0;
199 constexpr int connection_lost = base - 1;
200 constexpr int connection_timeout = base - 2;
201 constexpr int invalid_connection_string = base - 3;
202
203 // Pool errors (-520 to -539)
204 constexpr int pool_exhausted = base - 20;
205 constexpr int pool_shutdown = base - 21;
206 constexpr int pool_timeout = base - 22;
207
208 // Query errors (-540 to -559)
209 constexpr int query_failed = base - 40;
210 constexpr int query_syntax_error = base - 41;
211 constexpr int query_timeout = base - 42;
212
213 // Transaction errors (-560 to -579)
214 constexpr int transaction_failed = base - 60;
215 constexpr int transaction_rolled_back = base - 61;
216 constexpr int transaction_timeout = base - 62;
217} // namespace database_system
218
219// ============================================================================
220// network_system Error Codes (-600 to -699)
221// ============================================================================
222namespace network_system {
223 constexpr int base = static_cast<int>(category::network_system);
224
225 // Connection errors (-600 to -619)
226 constexpr int connection_failed = base - 0;
227 constexpr int connection_refused = base - 1;
228 constexpr int connection_timeout = base - 2;
229 constexpr int connection_closed = base - 3;
230
231 // Session errors (-620 to -639)
232 constexpr int session_not_found = base - 20;
233 constexpr int session_expired = base - 21;
234 constexpr int invalid_session = base - 22;
235
236 // Send/Receive errors (-640 to -659)
237 constexpr int send_failed = base - 40;
238 constexpr int receive_failed = base - 41;
239 constexpr int message_too_large = base - 42;
240
241 // Server errors (-660 to -679)
242 constexpr int server_not_started = base - 60;
243 constexpr int server_already_running = base - 61;
244 constexpr int bind_failed = base - 62;
245} // namespace network_system
246
247// ============================================================================
248// pacs_system Error Codes (-700 to -799)
249// ============================================================================
250namespace pacs_system {
251 constexpr int base = static_cast<int>(category::pacs_system);
252
253 // DICOM file errors (-700 to -719)
254 constexpr int file_not_found = base - 0;
255 constexpr int file_read_error = base - 1;
256 constexpr int file_write_error = base - 2;
257 constexpr int invalid_dicom_file = base - 3;
258 constexpr int missing_dicm_prefix = base - 4;
259 constexpr int invalid_meta_info = base - 5;
260 constexpr int missing_transfer_syntax = base - 6;
262
263 // DICOM element errors (-720 to -739)
264 constexpr int element_not_found = base - 20;
265 constexpr int value_conversion_error = base - 21;
266 constexpr int invalid_vr = base - 22;
267 constexpr int invalid_tag = base - 23;
268 constexpr int data_size_mismatch = base - 24;
269
270 // Encoding/Decoding errors (-740 to -759)
271 constexpr int decode_error = base - 40;
272 constexpr int encode_error = base - 41;
273 constexpr int compression_error = base - 42;
274 constexpr int decompression_error = base - 43;
275
276 // Network/Association errors (-760 to -779)
277 constexpr int association_rejected = base - 60;
278 constexpr int association_aborted = base - 61;
279 constexpr int dimse_error = base - 62;
280 constexpr int pdu_error = base - 63;
281
282 // Storage errors (-780 to -799)
283 constexpr int storage_failed = base - 80;
284 constexpr int retrieve_failed = base - 81;
285 constexpr int query_failed = base - 82;
286} // namespace pacs_system
287
288} // namespace codes
289
290// ============================================================================
291// Compile-time Range Validation
292// ============================================================================
293
302namespace validation {
303
304// Validate thread_system range (-100 to -199)
305static_assert(codes::thread_system::base == -100,
306 "thread_system base must be -100");
308 "thread_system error codes must be in range [-199, -100]");
310 "thread_system error codes must be in range [-199, -100]");
311
312// Validate logger_system range (-200 to -299)
313static_assert(codes::logger_system::base == -200,
314 "logger_system base must be -200");
316 "logger_system error codes must be in range [-299, -200]");
318 "logger_system error codes must be in range [-299, -200]");
319
320// Validate monitoring_system range (-300 to -399)
321static_assert(codes::monitoring_system::base == -300,
322 "monitoring_system base must be -300");
324 "monitoring_system error codes must be in range [-399, -300]");
326 "monitoring_system error codes must be in range [-399, -300]");
327
328// Validate container_system range (-400 to -499)
329static_assert(codes::container_system::base == -400,
330 "container_system base must be -400");
332 "container_system error codes must be in range [-499, -400]");
334 "container_system error codes must be in range [-499, -400]");
335
336// Validate database_system range (-500 to -599)
337static_assert(codes::database_system::base == -500,
338 "database_system base must be -500");
340 "database_system error codes must be in range [-599, -500]");
342 "database_system error codes must be in range [-599, -500]");
343
344// Validate network_system range (-600 to -699)
345static_assert(codes::network_system::base == -600,
346 "network_system base must be -600");
348 "network_system error codes must be in range [-699, -600]");
350 "network_system error codes must be in range [-699, -600]");
351
352// Validate common errors range (-1 to -99)
353static_assert(codes::common_errors::success == 0, "Success code must be 0");
355 "common error codes must be in range [-99, -1]");
357 "common error codes must be in range [-99, -1]");
358
359// Validate DI error sub-range (-50 to -59, within common)
361 "DI error codes must start at -50");
363 "DI error codes must be in range [-59, -50]");
364
365// Validate pacs_system range (-700 to -799)
366static_assert(codes::pacs_system::base == -700,
367 "pacs_system base must be -700");
369 "pacs_system error codes must be in range [-799, -700]");
371 "pacs_system error codes must be in range [-799, -700]");
372
373} // namespace validation
374
380inline std::string_view get_error_message(int code) {
381 switch (code) {
382 // Common errors
383 case codes::common_errors::success: return "Success";
384 case codes::common_errors::invalid_argument: return "Invalid argument";
385 case codes::common_errors::not_found: return "Not found";
386 case codes::common_errors::permission_denied: return "Permission denied";
387 case codes::common_errors::timeout: return "Timeout";
388 case codes::common_errors::cancelled: return "Cancelled";
389 case codes::common_errors::not_initialized: return "Not initialized";
390 case codes::common_errors::already_exists: return "Already exists";
391 case codes::common_errors::out_of_memory: return "Out of memory";
392 case codes::common_errors::io_error: return "I/O error";
393 case codes::common_errors::network_error: return "Network error";
394 case codes::common_errors::registry_frozen: return "Registry is frozen";
395 case codes::common_errors::internal_error: return "Internal error";
396
397 // DI errors
398 case codes::common_errors::di_service_not_registered: return "Service not registered in container";
399 case codes::common_errors::di_circular_dependency: return "Circular dependency detected";
400 case codes::common_errors::di_already_registered: return "Service already registered";
401 case codes::common_errors::di_factory_error: return "Factory error during instantiation";
402 case codes::common_errors::di_invalid_lifetime: return "Invalid service lifetime configuration";
403 case codes::common_errors::di_scoped_from_root: return "Scoped service resolved from root container";
404
405 // thread_system errors
406 case codes::thread_system::pool_full: return "Thread pool full";
407 case codes::thread_system::pool_shutdown: return "Thread pool shutdown";
408 case codes::thread_system::job_rejected: return "Job rejected";
409 case codes::thread_system::job_timeout: return "Job timeout";
410
411 // logger_system errors
412 case codes::logger_system::file_open_failed: return "Failed to open log file";
413 case codes::logger_system::file_write_failed: return "Failed to write to log file";
414 case codes::logger_system::file_rotation_failed: return "Log file rotation failed";
415
416 // monitoring_system errors
417 case codes::monitoring_system::metric_not_found: return "Metric not found";
418 case codes::monitoring_system::storage_full: return "Metric storage full";
419
420 // container_system errors
421 case codes::container_system::value_type_mismatch: return "Value type mismatch";
422 case codes::container_system::serialization_failed: return "Serialization failed";
423 case codes::container_system::pool_exhausted: return "Memory pool exhausted";
424
425 // database_system errors
426 case codes::database_system::connection_failed: return "Database connection failed";
427 case codes::database_system::pool_exhausted: return "Connection pool exhausted";
428 case codes::database_system::query_failed: return "Database query failed";
429
430 // network_system errors
431 case codes::network_system::connection_failed: return "Network connection failed";
432 case codes::network_system::send_failed: return "Network send failed";
433 case codes::network_system::server_not_started: return "Server not started";
434
435 // pacs_system errors
436 case codes::pacs_system::file_not_found: return "DICOM file not found";
437 case codes::pacs_system::file_read_error: return "Failed to read DICOM file";
438 case codes::pacs_system::file_write_error: return "Failed to write DICOM file";
439 case codes::pacs_system::invalid_dicom_file: return "Invalid DICOM file format";
440 case codes::pacs_system::missing_dicm_prefix: return "Missing DICM prefix";
441 case codes::pacs_system::invalid_meta_info: return "Invalid File Meta Information";
442 case codes::pacs_system::missing_transfer_syntax: return "Missing Transfer Syntax";
443 case codes::pacs_system::unsupported_transfer_syntax: return "Unsupported Transfer Syntax";
444 case codes::pacs_system::element_not_found: return "DICOM element not found";
445 case codes::pacs_system::value_conversion_error: return "Value conversion failed";
446 case codes::pacs_system::decode_error: return "DICOM decode error";
447 case codes::pacs_system::encode_error: return "DICOM encode error";
448 case codes::pacs_system::association_rejected: return "DICOM association rejected";
449 case codes::pacs_system::storage_failed: return "DICOM storage failed";
450
451 default: return "Unknown error";
452 }
453}
454
460inline std::string_view get_category_name(int code) {
461 if (code >= 0) return "Success";
462 if (code > static_cast<int>(category::thread_system)) return "Common";
463 if (code > static_cast<int>(category::logger_system)) return "ThreadSystem";
464 if (code > static_cast<int>(category::monitoring_system)) return "LoggerSystem";
465 if (code > static_cast<int>(category::container_system)) return "MonitoringSystem";
466 if (code > static_cast<int>(category::database_system)) return "ContainerSystem";
467 if (code > static_cast<int>(category::network_system)) return "DatabaseSystem";
468 if (code > static_cast<int>(category::pacs_system)) return "NetworkSystem";
469 return "PACSSystem";
470}
471
472} // namespace error
473} // namespace kcenon::common
Specific error codes organized by category.
std::string_view get_error_message(int code)
Get human-readable error message for error code.
category
Error code category ranges for compile-time validation.
Definition error_codes.h:37
std::string_view get_category_name(int code)
Get category name for error code.
Core interfaces.
Definition adapter.h:21