// Copyright (c) 2022 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or https://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UTIL_RESULT_H #define BITCOIN_UTIL_RESULT_H #include #include /* * 'BResult' is a generic class useful for wrapping a return object * (in case of success) or propagating the error cause. */ template class BResult { private: std::variant m_variant; public: BResult() : m_variant{Untranslated("")} {} BResult(T obj) : m_variant{std::move(obj)} {} BResult(bilingual_str error) : m_variant{std::move(error)} {} /* Whether the function succeeded or not */ bool HasRes() const { return std::holds_alternative(m_variant); } /* In case of success, the result object */ const T& GetObj() const { assert(HasRes()); return std::get(m_variant); } T ReleaseObj() { assert(HasRes()); return std::move(std::get(m_variant)); } /* In case of failure, the error cause */ const bilingual_str& GetError() const { assert(!HasRes()); return std::get(m_variant); } explicit operator bool() const { return HasRes(); } }; #endif // BITCOIN_UTIL_RESULT_H