/* ** Copyright (C) 2019-2023 Dirk-Jan C. Binnema ** ** This program is free software; you can redistribute it and/or modify it ** under the terms of the GNU General Public License as published by the ** Free Software Foundation; either version 3, or (at your option) any ** later version. ** ** 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 General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software Foundation, ** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #ifndef MU_RESULT_HH__ #define MU_RESULT_HH__ #include "thirdparty/expected.hpp" #include "utils/mu-error.hh" namespace Mu { /** * A little Rust-envy...a Result is _either_ some value of type T, _or_ a Mu::Error */ template using Result = tl::expected; /** * Ok() is not typically strictly needed (unlike Err), but imitates Rust's Ok * and it helps the reader. * * @param t the value to return * * @return a success Result */ template class Result::expected Ok(T&& t) { return std::move(t); } /** * Implementation of Ok() for void results. * * @return a success Result */ static inline Result Ok() { return {}; } /** * Return an error * * @param err the error * * @return error */ static inline tl::unexpected Err(Error&& err) { return tl::unexpected(std::move(err)); } static inline tl::unexpected Err(const Error& err) { return tl::unexpected(err); } template static inline tl::unexpected Err(const Result& res) { return res.error(); } /* * convenience */ template inline tl::unexpected Err(Error::Code code, fmt::format_string frm, T&&... args) { return Err(Error{code, frm, std::forward(args)...}); } template inline tl::unexpected Err(Error::Code code, GError **err, fmt::format_string frm, T&&... args) { return Err(Error{code, err, frm, std::forward(args)...}); } /** * Assert that some result has a value (for unit tests) * * @param R some result */ #define assert_valid_result(R) do { \ if(!R) { \ mu_printerrln("{}:{}: error-result: {}", \ __FILE__, __LINE__, \ (R).error().what()); \ g_assert_true(!!R); \ } \ } while(0) }// namespace Mu #endif /* MU_RESULT_HH__ */