Common System 1.0.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 // Uppercase aliases for backward compatibility
51
52 // Module-specific base ranges
53 constexpr int THREAD_ERROR_BASE = static_cast<int>(error::category::thread_system);
54 constexpr int LOGGER_ERROR_BASE = static_cast<int>(error::category::logger_system);
55 constexpr int MONITORING_ERROR_BASE = static_cast<int>(error::category::monitoring_system);
56 constexpr int CONTAINER_ERROR_BASE = static_cast<int>(error::category::container_system);
57 constexpr int DATABASE_ERROR_BASE = static_cast<int>(error::category::database_system);
58 constexpr int NETWORK_ERROR_BASE = static_cast<int>(error::category::network_system);
59} // namespace error_codes
60
61// ============================================================================
62// Factory Functions
63// ============================================================================
64
73template<typename T>
74inline Result<T> ok(T value) {
75 return Result<T>(std::move(value));
76}
77
78// Note: VoidResult ok() is defined in :result.core partition to avoid circular
79// dependencies and ensure availability in modules that only import :result.core.
80
88template<typename T>
89inline Result<T> make_error(int code, const std::string& message,
90 const std::string& module = "") {
91 return Result<T>(error_info{code, message, module});
92}
93
97template<typename T>
98inline Result<T> make_error(int code, const std::string& message,
99 const std::string& module,
100 const std::string& details) {
101 return Result<T>(error_info{code, message, module, details});
102}
103
107template<typename T>
108inline Result<T> make_error(const error_info& err) {
109 return Result<T>(err);
110}
111
112// ============================================================================
113// Exception Conversion
114// ============================================================================
115
121public:
122 static error_info map_unknown_exception(const std::string& module = "") {
123 return error_info{error_codes::INTERNAL_ERROR, "Unknown exception caught", module,
124 "Non-standard exception (not derived from std::exception)"};
125 }
126
127 static error_info map_generic_exception(const std::exception& e, const std::string& module = "") {
128 return error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::exception"};
129 }
130};
131
141template<typename T, typename F>
142Result<T> try_catch(F&& func, const std::string& module = "") {
143 try {
144 return ok<T>(func());
145 }
146 catch (const std::bad_alloc& e) {
147 return Result<T>(error_info{error_codes::OUT_OF_MEMORY, e.what(), module, "std::bad_alloc"});
148 }
149 catch (const std::invalid_argument& e) {
150 return Result<T>(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::invalid_argument"});
151 }
152 catch (const std::out_of_range& e) {
153 return Result<T>(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::out_of_range"});
154 }
155 catch (const std::system_error& e) {
156 return Result<T>(error_info{e.code().value(), e.what(), module,
157 std::string("std::system_error: ") + e.code().category().name()});
158 }
159 catch (const std::logic_error& e) {
160 return Result<T>(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::logic_error"});
161 }
162 catch (const std::runtime_error& e) {
163 return Result<T>(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::runtime_error"});
164 }
165 catch (const std::exception& e) {
166 return Result<T>(exception_mapper::map_generic_exception(e, module));
167 }
168 catch (...) {
169 return Result<T>(exception_mapper::map_unknown_exception(module));
170 }
171}
172
181template<typename F>
182VoidResult try_catch_void(F&& func, const std::string& module = "") {
183 try {
184 func();
185 return ok();
186 }
187 catch (const std::bad_alloc& e) {
188 return VoidResult(error_info{error_codes::OUT_OF_MEMORY, e.what(), module, "std::bad_alloc"});
189 }
190 catch (const std::invalid_argument& e) {
191 return VoidResult(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::invalid_argument"});
192 }
193 catch (const std::out_of_range& e) {
194 return VoidResult(error_info{error_codes::INVALID_ARGUMENT, e.what(), module, "std::out_of_range"});
195 }
196 catch (const std::system_error& e) {
197 return VoidResult(error_info{e.code().value(), e.what(), module,
198 std::string("std::system_error: ") + e.code().category().name()});
199 }
200 catch (const std::logic_error& e) {
201 return VoidResult(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::logic_error"});
202 }
203 catch (const std::runtime_error& e) {
204 return VoidResult(error_info{error_codes::INTERNAL_ERROR, e.what(), module, "std::runtime_error"});
205 }
206 catch (const std::exception& e) {
208 }
209 catch (...) {
211 }
212}
213
214} // 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