diff options
author | Joel Rosdahl <joel@rosdahl.net> | 2022-09-08 13:26:25 +0200 |
---|---|---|
committer | Joel Rosdahl <joel@rosdahl.net> | 2022-09-21 17:06:27 +0200 |
commit | 9bdf5410660f3be84018642dd60be30dba1816c1 (patch) | |
tree | 1bc94415d430102559ca57df3d34a6da2901f106 /src/util/expected.hpp | |
parent | caf242723a991a77f229786374d71dc805a7af42 (diff) | |
download | ccache-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.hpp | 33 |
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 |