10 #include <hilti/rt/exception.h>
11 #include <hilti/rt/types/optional.h>
20 Error(std::string_view description =
"<no description>", std::string_view context =
"")
21 : _description(description), _context(context) {}
23 std::string_view description()
const {
return _description; }
24 std::string_view context()
const {
return _context; }
26 operator std::string()
const {
return _description; }
27 operator std::string_view()
const {
return _description; }
30 std::string _description;
34 inline std::ostream& operator<<(std::ostream& out,
const Error& error) {
35 out << error.description();
39 inline bool operator==(
const Error& a,
const Error& b) {
return a.description() == b.description(); }
40 inline bool operator!=(
const Error& a,
const Error& b) {
return ! (a == b); }
45 NoResult(
Error err) : RuntimeError(err.description()), _error(std::move(err)) {}
54 NoError() : RuntimeError(
"<no error>") {}
61 inline bool operator==(
const Nothing&,
const Nothing&) {
return true; }
62 inline bool operator!=(
const Nothing&,
const Nothing&) {
return false; }
64 namespace detail::adl {
65 inline std::string
to_string(
const Nothing& , adl::tag ) {
return "<nothing>"; };
75 Result() : _value(std::in_place_type_t<result::Error>(),
result::Error(
"<result not initialized>")) {}
78 Result(
const T& t) : _value(std::in_place_type_t<T>(), t) {}
80 Result(T&& t) : _value(std::in_place_type_t<T>(), std::move(t)) {}
96 const T&
value() const& {
return std::get<T>(_value); }
104 T&
value() & {
return std::get<T>(_value); }
112 T
value() && {
return std::get<T>(std::move(_value)); }
121 template<
typename E = result::NoResult>
136 template<
typename E = result::NoResult>
151 template<
typename E = result::NoResult>
189 bool hasValue()
const {
return std::holds_alternative<T>(_value); }
198 const T*
operator->() const& {
return std::get_if<T>(&_value); }
205 explicit operator bool()
const {
return hasValue(); }
210 friend bool operator==(
const Result& a,
const Result& b) {
220 friend bool operator!=(
const Result& a,
const Result& b) {
return ! (a == b); }
223 std::variant<T, result::Error> _value;
Result(const result::Error &e)
Definition: result.h:82
T & value() &
Definition: result.h:104
const T * operator->() const &
Definition: result.h:198
T value() &&
Definition: result.h:112
const result::Error & error() const &
Definition: result.h:165
T * operator->() &
Definition: result.h:200
const T & valueOrThrow() const &
Definition: result.h:122
const result::Error & errorOrThrow() const
Definition: result.h:181
bool hasValue() const
Definition: result.h:189
T & operator*() &
Definition: result.h:194
result::Error error() &&
Definition: result.h:173
T * operator->() &&=delete
T operator*() &&
Definition: result.h:196
T valueOrThrow() &&
Definition: result.h:152
const T & value() const &
Definition: result.h:96
Result(const T &t)
Definition: result.h:78
Result(T &&t)
Definition: result.h:80
const T & operator*() const &
Definition: result.h:192
T & valueOrThrow() &
Definition: result.h:137
Result(result::Error &&e)
Definition: result.h:84
std::string to_string(T &&x)
Definition: extension-points.h:26
Result< T > make_result(T &&t)
Definition: result.h:228