aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am1
-rw-r--r--src/util/result.h43
2 files changed, 44 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 3fbbe180fc..a9e9db0a7d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -277,6 +277,7 @@ BITCOIN_CORE_H = \
util/overloaded.h \
util/rbf.h \
util/readwritefile.h \
+ util/result.h \
util/serfloat.h \
util/settings.h \
util/sock.h \
diff --git a/src/util/result.h b/src/util/result.h
new file mode 100644
index 0000000000..dcf5edaa5b
--- /dev/null
+++ b/src/util/result.h
@@ -0,0 +1,43 @@
+// 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 <util/translation.h>
+#include <variant>
+
+/*
+ * 'BResult' is a generic class useful for wrapping a return object
+ * (in case of success) or propagating the error cause.
+*/
+template<class T>
+class BResult {
+private:
+ std::variant<bilingual_str, T> m_variant;
+
+public:
+ BResult() : m_variant(Untranslated("")) {}
+ BResult(const T& _obj) : m_variant(_obj) {}
+ BResult(const bilingual_str& error) : m_variant(error) {}
+
+ /* Whether the function succeeded or not */
+ bool HasRes() const { return std::holds_alternative<T>(m_variant); }
+
+ /* In case of success, the result object */
+ const T& GetObj() const {
+ assert(HasRes());
+ return std::get<T>(m_variant);
+ }
+
+ /* In case of failure, the error cause */
+ const bilingual_str& GetError() const {
+ assert(!HasRes());
+ return std::get<bilingual_str>(m_variant);
+ }
+
+ explicit operator bool() const { return HasRes(); }
+};
+
+#endif // BITCOIN_UTIL_RESULT_H