20#include "ignite_error.h"
37 ignite_result() =
default;
45 : m_value(std::move(
value)) {}
53 : m_value(std::move(
error)) {}
67 [[nodiscard]]
bool has_error() const noexcept {
return std::holds_alternative<ignite_error>(m_value); }
78 return std::get<T>(std::move(m_value));
86 [[nodiscard]]
const T &
value() const & {
90 return std::get<T>(m_value);
102 return std::get<T>(m_value);
114 return std::move(std::get<ignite_error>(m_value));
126 return std::get<ignite_error>(m_value);
138 return std::get<ignite_error>(m_value);
147 explicit operator bool() const noexcept {
return !
has_error(); }
151 std::variant<ignite_error, T> m_value;
164 : m_error(std::nullopt) {}
172 : m_error(std::move(
error)) {}
179 [[nodiscard]]
bool has_error() const noexcept {
return m_error.has_value(); }
190 return std::move(m_error.value());
202 return m_error.value();
211 explicit operator bool() const noexcept {
return !
has_error(); }
215 std::optional<ignite_error> m_error;
219using ignite_callback = std::function<void(ignite_result<T> &&)>;
228ignite_result<T> result_of_operation(
const std::function<T()> &operation)
noexcept {
230 if constexpr (std::is_same_v<
decltype(operation()),
void>) {
234 return {operation()};
238 }
catch (
const std::exception &err) {
239 std::string msg(
"Standard library exception is thrown: ");
241 return {
ignite_error(error::code::INTERNAL, msg, std::current_exception())};
243 return {
ignite_error(error::code::INTERNAL,
"Unknown error is encountered",
244 std::current_exception())};
257 pr.set_exception(std::make_exception_ptr(std::move(res).error()));
259 if constexpr (std::is_same_v<T, void>) {
262 pr.set_value(std::move(res).value());
274std::function<void(
ignite_result<T>)> result_promise_setter(std::shared_ptr<std::promise<T>> pr) {
275 return [pr = std::move(pr)](
ignite_result<T> &&res)
mutable { result_set_promise<T>(*pr, std::move(res)); };
285T sync(std::function<
void(ignite_callback<T>)> func) {
286 auto promise = std::make_shared<std::promise<T>>();
287 func(result_promise_setter(promise));
288 return promise->get_future().get();
Definition ignite_error.h:35
const ignite_error & error() const
Definition ignite_result.h:198
ignite_result(ignite_error &&error)
Definition ignite_result.h:171
ignite_error && error()
Definition ignite_result.h:186
bool has_error() const noexcept
Definition ignite_result.h:179
ignite_result()
Definition ignite_result.h:163
Definition ignite_result.h:34
ignite_result(T &&value)
Definition ignite_result.h:44
ignite_error && error() &&
Definition ignite_result.h:110
bool has_value() const noexcept
Definition ignite_result.h:60
const ignite_error & error() const &
Definition ignite_result.h:122
bool has_error() const noexcept
Definition ignite_result.h:67
T && value() &&
Definition ignite_result.h:74
ignite_result(ignite_error &&error)
Definition ignite_result.h:52
const T & value() const &
Definition ignite_result.h:86
T & value() &
Definition ignite_result.h:98
ignite_error & error() &
Definition ignite_result.h:134