11#include <absl/status/status.h>
12#include <absl/status/statusor.h>
24 using Result = std::conditional_t<std::is_void_v<V>, absl::Status, absl::StatusOr<V>>;
29 using Value = std::conditional_t<std::is_same_v<R, absl::Status>, void,
34 std::rethrow_exception(std::move(e));
36 return absl::CancelledError(
"yaclib::StopException");
37 }
catch (
const std::exception& exception) {
38 return absl::UnknownError(exception.what());
40 return absl::UnknownError(
"unknown exception");
44 template <
typename V,
typename... Args>
46 static_assert(
sizeof...(Args) > 0);
48 if constexpr (
sizeof...(Args) == 1 && std::is_same_v<Head, yaclib::Unit>) {
49 if constexpr (std::is_void_v<V>) {
50 return absl::OkStatus();
54 }
else if constexpr (
sizeof...(Args) == 1 && std::is_same_v<Head, yaclib::StopTag>) {
55 return Result<V>{absl::CancelledError(
"yaclib::StopTag")};
56 }
else if constexpr (
sizeof...(Args) == 1 && std::is_same_v<Head, std::exception_ptr>) {
58 }
else if constexpr (std::is_same_v<Head, std::in_place_t> ||
59 (
sizeof...(Args) == 1 &&
60 (std::is_same_v<Head, absl::Status> || std::is_same_v<Head,
Result<V>>))) {
61 if constexpr (std::is_void_v<V> && std::is_same_v<Head, std::in_place_t>) {
62 return absl::OkStatus();
64 return Result<V>{std::forward<Args>(args)...};
67 return Result<V>{std::in_place, std::forward<Args>(args)...};
72 static bool Ok(
const absl::Status& r)
noexcept {
76 static bool Ok(
const absl::StatusOr<U>& r)
noexcept {
81 static decltype(
auto)
GetValue(R&& r)
noexcept {
82 if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<R>>, absl::Status>) {
85 return *std::forward<R>(r);
90 static decltype(
auto)
GetError(R&& r)
noexcept {
91 if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<R>>, absl::Status>) {
92 return std::forward<R>(r);
94 return std::forward<R>(r).status();
99 static decltype(
auto)
Get(R&& r) {
100 if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<R>>, absl::Status>) {
102 throw absl::BadStatusOrAccess{std::forward<R>(r)};
105 return std::forward<R>(r).value();
109 static bool IsStop(
const absl::Status& error)
noexcept {
110 return error.code() == absl::StatusCode::kCancelled;
Contract< V, T > MakeContract()
Creates related future and promise.
typename detail::Head< Args... >::Type head_t
Exception that represents cancellation of an async operation,.
Result trait that plugs absl::StatusOr<V> into yaclib,.
static bool IsStop(const absl::Status &error) noexcept
static decltype(auto) Get(R &&r)
static Result< V > MakeResult(Args &&... args)
std::conditional_t< std::is_same_v< R, absl::Status >, void, typename yaclib::detail::InstantiationType< absl::StatusOr, R >::Value > Value
static decltype(auto) GetValue(R &&r) noexcept
static decltype(auto) GetError(R &&r) noexcept
static bool Ok(const absl::StatusOr< U > &r) noexcept
static bool Ok(const absl::Status &r) noexcept
std::conditional_t< std::is_void_v< V >, absl::Status, absl::StatusOr< V > > Result
static absl::Status FromException(std::exception_ptr e) noexcept