summaryrefslogtreecommitdiff
path: root/src/util/expected.hpp
diff options
context:
space:
mode:
authorJoel Rosdahl <joel@rosdahl.net>2022-09-08 13:26:25 +0200
committerJoel Rosdahl <joel@rosdahl.net>2022-09-21 17:06:27 +0200
commit9bdf5410660f3be84018642dd60be30dba1816c1 (patch)
tree1bc94415d430102559ca57df3d34a6da2901f106 /src/util/expected.hpp
parentcaf242723a991a77f229786374d71dc805a7af42 (diff)
downloadccache-9bdf5410660f3be84018642dd60be30dba1816c1.tar.gz
enhance: Add prefix parameter to util::value_or_throw
Diffstat (limited to 'src/util/expected.hpp')
-rw-r--r--src/util/expected.hpp33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/util/expected.hpp b/src/util/expected.hpp
index 95926f92..e0320da8 100644
--- a/src/util/expected.hpp
+++ b/src/util/expected.hpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2021 Joel Rosdahl and other contributors
+// Copyright (C) 2021-2022 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
@@ -18,6 +18,9 @@
#pragma once
+#include <fmtmacros.hpp>
+
+#include <string_view>
#include <utility>
namespace util {
@@ -31,6 +34,12 @@ typename T::value_type value_or_throw(const T& value);
template<typename E, typename T>
typename T::value_type value_or_throw(T&& value);
+// As above for with `prefix` added to the error message.
+template<typename E, typename T>
+typename T::value_type value_or_throw(const T& value, std::string_view prefix);
+template<typename E, typename T>
+typename T::value_type value_or_throw(T&& value, std::string_view prefix);
+
#define TRY(x_) \
do { \
const auto result = x_; \
@@ -63,4 +72,26 @@ value_or_throw(T&& value)
}
}
+template<typename E, typename T>
+inline typename T::value_type
+value_or_throw(const T& value, std::string_view prefix)
+{
+ if (value) {
+ return *value;
+ } else {
+ throw E(FMT("{}{}", prefix, value.error()));
+ }
+}
+
+template<typename E, typename T>
+inline typename T::value_type
+value_or_throw(T&& value, std::string_view prefix)
+{
+ if (value) {
+ return std::move(*value);
+ } else {
+ throw E(FMT("{}{}", prefix, value.error()));
+ }
+}
+
} // namespace util