Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
utilities.cppm
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
17module;
18
19#include <stdexcept>
20#include <string>
21#include <system_error>
22#include <utility>
23#include <variant>
24
26
27import :result.core;
28import :error;
29
30export namespace kcenon::common {
31
32// ============================================================================
33// Error Code Compatibility Aliases
34// ============================================================================
35
36namespace error_codes {
37 using namespace error::codes::common_errors;
38
39 // Uppercase aliases for backward compatibility
53
54 // Module-specific base ranges
55 constexpr int THREAD_ERROR_BASE = static_cast<int>(error::category::thread_system);
56 constexpr int LOGGER_ERROR_BASE = static_cast<int>(error::category::logger_system);
57 constexpr int MONITORING_ERROR_BASE = static_cast<int>(error::category::monitoring_system);
58 constexpr int CONTAINER_ERROR_BASE = static_cast<int>(error::category::container_system);
59 constexpr int DATABASE_ERROR_BASE = static_cast<int>(error::category::database_system);
60 constexpr int NETWORK_ERROR_BASE = static_cast<int>(error::category::network_system);
61} // namespace error_codes
62
63// ============================================================================
64// Factory Functions
65// ============================================================================
66
75template<typename T>
76inline Result<T> ok(T value) {
77 return Result<T>(std::move(value));
78}
79
80// Note: VoidResult ok() is defined in :result.core partition to avoid circular
81// dependencies and ensure availability in modules that only import :result.core.
82
90template<typename T>
91inline Result<T> make_error(int code, const std::string& message,
92 const std::string& module = "") {
93 return Result<T>(error_info{code, message, module});
94}
95
99template<typename T>
100inline Result<T> make_error(int code, const std::string& message,
101 const std::string& module,
102 const std::string& details) {
103 return Result<T>(error_info{code, message, module, details});
104}
105
109template<typename T>
110inline Result<T> make_error(const error_info& err) {
111 return Result<T>(err);
112}
113
114// ============================================================================
115// Exception Conversion
116// ============================================================================
117
123public:
124 static error_info map_unknown_exception(const std::string& module = "") {
125 return error_info{error_codes::INTERNAL_ERROR, "Unknown exception caught", module,
126 "Non-standard exception (not derived from std::exception)"};
127 }
128
129 static error_info map_generic_exception(const std::exception& e, const std::string& module = "") {
130 return error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::exception"};
131 }
132};
133
143template<typename T, typename F>
144Result<T> try_catch(F&& func, const std::string& module = "") {
145 try {
146 return ok<T>(func());
147 }
148 catch (const std::bad_alloc& e) {
149 return Result<T>(error_info{error_codes::OUT_OF_MEMORY, e.what(), module, "std::bad_alloc"});
150 }
151 catch (const std::invalid_argument& e) {
152 return Result<T>(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::invalid_argument"});
153 }
154 catch (const std::out_of_range& e) {
155 return Result<T>(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::out_of_range"});
156 }
157 catch (const std::system_error& e) {
158 return Result<T>(error_info{e.code().value(), e.what(), module,
159 std::string("std::system_error: ") + e.code().category().name()});
160 }
161 catch (const std::logic_error& e) {
162 return Result<T>(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::logic_error"});
163 }
164 catch (const std::runtime_error& e) {
165 return Result<T>(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::runtime_error"});
166 }
167 catch (const std::exception& e) {
168 return Result<T>(exception_mapper::map_generic_exception(e, module));
169 }
170 catch (...) {
171 return Result<T>(exception_mapper::map_unknown_exception(module));
172 }
173}
174
183template<typename F>
184VoidResult try_catch_void(F&& func, const std::string& module = "") {
185 try {
186 func();
187 return ok();
188 }
189 catch (const std::bad_alloc& e) {
190 return VoidResult(error_info{error_codes::OUT_OF_MEMORY, e.what(), module, "std::bad_alloc"});
191 }
192 catch (const std::invalid_argument& e) {
193 return VoidResult(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::invalid_argument"});
194 }
195 catch (const std::out_of_range& e) {
196 return VoidResult(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::out_of_range"});
197 }
198 catch (const std::system_error& e) {
199 return VoidResult(error_info{e.code().value(), e.what(), module,
200 std::string("std::system_error: ") + e.code().category().name()});
201 }
202 catch (const std::logic_error& e) {
203 return VoidResult(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::logic_error"});
204 }
205 catch (const std::runtime_error& e) {
206 return VoidResult(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::runtime_error"});
207 }
208 catch (const std::exception& e) {
210 }
211 catch (...) {
213 }
214}
215
216} // namespace kcenon::common
Maps standard exception types to appropriate error codes.
static error_info map_unknown_exception(const std::string &module="")
static error_info map_generic_exception(const std::exception &e, const std::string &module="")
constexpr int NETWORK_ERROR_BASE
Definition compat.h:50
constexpr int PERMISSION_DENIED
Definition compat.h:33
constexpr int CANCELLED
Definition compat.h:35
constexpr int REGISTRY_FROZEN
Definition compat.h:41
constexpr int CONTAINER_ERROR_BASE
Definition compat.h:48
constexpr int MONITORING_ERROR_BASE
Definition compat.h:47
constexpr int NOT_FOUND
Definition compat.h:32
constexpr int SUCCESS
Definition compat.h:30
constexpr int THREAD_ERROR_BASE
Definition compat.h:45
constexpr int ALREADY_EXISTS
Definition compat.h:37
constexpr int TIMEOUT
Definition compat.h:34
constexpr int LOGGER_ERROR_BASE
Definition compat.h:46
constexpr int OUT_OF_MEMORY
Definition compat.h:38
constexpr int INVALID_ARGUMENT
Definition compat.h:31
constexpr int IO_ERROR
Definition compat.h:39
constexpr int INTERNAL_ERROR
Definition compat.h:42
constexpr int DATABASE_ERROR_BASE
Definition compat.h:49
constexpr int NETWORK_ERROR
Definition compat.h:40
constexpr int NOT_INITIALIZED
Definition compat.h:36
Core interfaces.
Definition adapter.h:21
Result< T > make_error(int code, const std::string &message, const std::string &module="")
Create an error result with code and message.
Definition utilities.h:91
Result< std::monostate > VoidResult
Specialized Result for void operations.
Definition core.h:70
Result< T > try_catch(F &&func, const std::string &module="")
Convert exception to Result with automatic error code mapping.
Definition utilities.h:173
VoidResult err(const error_info &error)
Factory function to create error VoidResult.
Definition core.cppm:432
VoidResult ok()
Create a successful void result.
Definition utilities.h:71
VoidResult try_catch_void(F &&func, const std::string &module="")
Convert exception to VoidResult with automatic error code mapping.
Definition utilities.h:224
Standard error information used by Result<T>.
Definition core.cppm:106