aboutsummaryrefslogtreecommitdiff
path: root/src/base/Base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/Base.cpp')
-rw-r--r--src/base/Base.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/base/Base.cpp b/src/base/Base.cpp
index c6d9ac07..49b0c462 100644
--- a/src/base/Base.cpp
+++ b/src/base/Base.cpp
@@ -1,8 +1,46 @@
#include "cru/base/Base.h"
+#include <cerrno>
#include <exception>
+#include <format>
+#include <string_view>
namespace cru {
void UnreachableCode() { std::terminate(); }
void NotImplemented() { std::terminate(); }
+
+static constexpr auto NO_MESSAGE = "No message.";
+
+Exception::Exception(std::string message, std::shared_ptr<std::exception> inner)
+ : message_(std::move(message)), inner_(std::move(inner)) {}
+
+Exception::~Exception() {}
+
+const char* Exception::what() const noexcept { return message_.c_str(); }
+
+void Exception::AppendMessage(const std::string& additional_message) {
+ AppendMessage(std::string_view(additional_message));
+}
+
+void Exception::AppendMessage(std::string_view additional_message) {
+ message_ += ' ';
+ message_ += additional_message;
+}
+
+void Exception::AppendMessage(
+ std::optional<std::string_view> additional_message) {
+ if (additional_message) AppendMessage(*additional_message);
+}
+
+ErrnoException::ErrnoException() : ErrnoException(NO_MESSAGE) {}
+
+ErrnoException::ErrnoException(int errno_code)
+ : ErrnoException(NO_MESSAGE, errno_code) {}
+
+ErrnoException::ErrnoException(std::string_view message)
+ : ErrnoException(message, errno) {}
+
+ErrnoException::ErrnoException(std::string_view message, int errno_code)
+ : Exception(std::format("{} Errno is {}.", message, errno_code)),
+ errno_code_(errno_code) {}
} // namespace cru