// Copyright 2022, FOSS-VG Developers and Contributers // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, version 3. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // version 3 along with this program. // If not, see https://www.gnu.org/licenses/agpl-3.0.en.html #pragma once #include template struct ErrorOr { bool isError; uint8_t errorCode; T value; ErrorOr(); ErrorOr(T); ErrorOr(bool, uint8_t); ErrorOr(bool, uint8_t, T); }; template ErrorOr::ErrorOr() { this->isError = false; this->errorCode = 0; } template ErrorOr::ErrorOr(T value) { this->isError = false; this->errorCode = 0; this->value = value; } template ErrorOr::ErrorOr(bool isError, uint8_t errorCode) { this->isError = isError; this->errorCode = errorCode; } template ErrorOr::ErrorOr(bool isError, uint8_t errorCode, T value) { this->isError = isError; this->errorCode = errorCode; this->value = value; } namespace ErrorCodes { // These are all arbitrary values used to assign error codes to different // kinds of errors. // Using them is optional as ErrorOr<> accepts any uint8_t value as // error code, but they are useful for readability. // Ahh yes, very useful. const uint8_t SUCCESS = 0; // IndexOutOfRangeException equivalent const uint8_t OUT_OF_RANGE = 1; // when going out of bounds in a non-predetermined way const uint8_t OVERRUN = 2; // when checking for presence of something, for example CLI arguments const uint8_t NOT_PRESENT = 3; const uint8_t WRONG_USAGE = 4; // when dealing with maps const uint8_t UNKNOWN_KEY = 5; const uint8_t UNIMPLEMENTED = 254; const uint8_t UNKNOWN = 255; //mismatched size in java strings const uint8_t MISMATCHEDSIZE = 6; }