11 #include <hilti/rt/exception.h>
20 Error(std::string description =
"<no description>", std::string context =
"")
21 : _description(std::move(description)), _context(std::move(context)) {}
22 const auto& description()
const {
return _description; }
23 const auto& context()
const {
return _context; }
24 operator std::string()
const {
return _description; }
25 operator std::string_view()
const {
return _description; }
28 std::string _description;
32 inline std::ostream& operator<<(std::ostream& out,
const Error& error) {
33 out << error.description();
37 inline bool operator==(
const Error& a,
const Error& b) {
return a.description() == b.description(); }
38 inline bool operator!=(
const Error& a,
const Error& b) {
return ! (a == b); }
43 NoResult(
Error err) : RuntimeError(err.description()), _error(std::move(err)) {}
52 NoError() : RuntimeError(
"<no error>") {}
59 inline bool operator==(
const Nothing&,
const Nothing&) {
return true; }
60 inline bool operator!=(
const Nothing&,
const Nothing&) {
return false; }
62 namespace detail::adl {
63 inline std::string
to_string(
const Nothing& n, adl::tag ) {
return "<nothing>"; };
73 Result() : _value(std::in_place_type_t<result::Error>(),
result::Error(
"<result not initialized>")) {}
76 Result(
const T& t) : _value(std::in_place_type_t<T>(), t) {}
78 Result(T&& t) : _value(std::in_place_type_t<T>(), std::move(t)) {}
94 const T&
value()
const {
return std::get<T>(_value); }
102 T&
value() {
return std::get<T>(_value); }
111 template<
typename E = result::NoResult>
126 template<
typename E = result::NoResult>
156 bool hasValue()
const {
return std::holds_alternative<T>(_value); }
163 const T*
operator->()
const {
return std::get_if<T>(&_value); }
168 explicit operator bool()
const {
return hasValue(); }
171 operator std::optional<T>()
const {
return hasValue() ? std::make_optional(
value()) : std::nullopt; }
176 friend bool operator==(
const Result& a,
const Result& b) {
186 friend bool operator!=(
const Result& a,
const Result& b) {
return ! (a == b); }
189 std::variant<T, result::Error> _value;
T & value()
Definition: result.h:102
Result(const result::Error &e)
Definition: result.h:80
T * operator->()
Definition: result.h:165
const T & valueOrThrow() const
Definition: result.h:112
const result::Error & error() const
Definition: result.h:140
const result::Error & errorOrThrow() const
Definition: result.h:148
const T & value() const
Definition: result.h:94
bool hasValue() const
Definition: result.h:156
const T * operator->() const
Definition: result.h:163
T & valueOrThrow()
Definition: result.h:127
Result(const T &t)
Definition: result.h:76
Result(T &&t)
Definition: result.h:78
T & operator*()
Definition: result.h:161
const T & operator*() const
Definition: result.h:159
Result(result::Error &&e)
Definition: result.h:82
std::string to_string(T &&x)
Definition: extension-points.h:26
Result< T > make_result(T &&t)
Definition: result.h:194