#pragma once #include #include namespace amalgine { template class Result { public: static Result Ok(T data) { Result result(std::move(data)); return result; } static Result Err(const std::string &errorMsg, int errorCode = -1) { Result result; result.errorMsg = errorMsg; result.errorCode = errorCode; return result; } template static Result Err(const Result &otherResult) { Result result; result.errorMsg = otherResult.getErrorMsg(); result.errorCode = otherResult.getErrorCode(); return result; } bool isOk() const { return errorCode == 0; } bool isErr() const { return !isOk(); } operator bool() const { return isOk(); } T& unwrap() { assert(isOk()); return data; } T* operator -> () { assert(isOk()); return &data; } const std::string& getErrorMsg() const { return errorMsg; } int getErrorCode() const { return errorCode; } private: Result() {} Result(T data) : data(std::move(data)), errorCode(0) {} private: T data; int errorCode; std::string errorMsg; }; }