diff --git a/core/src/error/error.cpp b/core/src/error/error.cpp new file mode 100644 index 0000000..1872963 --- /dev/null +++ b/core/src/error/error.cpp @@ -0,0 +1,17 @@ +#include "error.h" +#include "logger.h" + +Error::Error(std::string message) : message(message) { +} + +std::string Error::getMessage() { + return this->message; +} + +void Error::logMessage(Logger::LogLevel logLevel) { + Logger::logf("%s", logLevel, this->message); +} + +void Error::logMessageFatal() { + Logger::fatalErrorf("%s", this->message); +} \ No newline at end of file diff --git a/core/src/error/error.h b/core/src/error/error.h new file mode 100644 index 0000000..6422fd3 --- /dev/null +++ b/core/src/error/error.h @@ -0,0 +1,17 @@ +#pragma once + +#include "logger.h" +#include + +// Base class for all errors +class Error { + std::string message; + +protected: + Error(std::string message); + +public: + std::string getMessage(); + void logMessage(Logger::LogLevel logLevel = Logger::LogLevel::INFO); + void logMessageFatal(); +}; \ No newline at end of file diff --git a/core/src/error/fallible.h b/core/src/error/fallible.h new file mode 100644 index 0000000..ef6068c --- /dev/null +++ b/core/src/error/fallible.h @@ -0,0 +1,9 @@ +#pragma once + +#include "result.h" + +struct DUMMY_VALUE; + +template +class fallible : public result { +}; \ No newline at end of file diff --git a/core/src/error/result.cpp b/core/src/error/result.cpp new file mode 100644 index 0000000..8871e51 --- /dev/null +++ b/core/src/error/result.cpp @@ -0,0 +1,36 @@ +#include "result.h" +#include +#include + +template +result::result(Result value) : value(SuccessContainer { value }) { +} + +template +result::result(std::variant value) : value(ErrorContainer { value }) { +} + +template +bool result::is_success() { + return std::holds_alternative(value); +} + +template +bool result::is_error() { + return std::holds_alternative(value); +} + +template +std::optional result::success() { + return std::holds_alternative(value) ? std::make_optional(std::get(value).success) : std::nullopt; +} + +template +std::optional> result::error() { + return std::holds_alternative(value) ? std::make_optional(std::get(value).error) : std::nullopt; +} + +template +result::operator std::optional() { + return this->success(); +} diff --git a/core/src/error/result.h b/core/src/error/result.h new file mode 100644 index 0000000..c18fd0a --- /dev/null +++ b/core/src/error/result.h @@ -0,0 +1,34 @@ +#pragma once + +#include "error.h" +#include +#include +#include + +template +class [[nodiscard]] result { + struct ErrorContainer { + std::variant error; + }; + + struct SuccessContainer { + Result success; + }; + + std::variant value; +public: + result(Result value); + result(std::variant value); + + // Expects the result to be successful, otherwise panic with error message + Result expect(std::string errMsg = "Unwrapped a result with failure value"); + + bool is_success(); + bool is_error(); + + std::optional success(); + std::optional> error(); + + // Equivalent to .success + operator std::optional(); +}; \ No newline at end of file