[#result]
== cobalt/result.hpp

Awaitables can be modified to return `system::result` or
`std::tuple` instead of using exceptions.

[source,cpp]
----
// value only
T res = co_await foo();

// as result
system::result<T, std::exception_ptr> res = co_await cobalt::as_result(foo());

// as tuple
std::tuple<std::exception_ptr, T> res = co_await cobalt::as_tuple(foo());
----


Awaitables can also provide custom ways to handle results and tuples,
by providing `await_resume` overloads using `cobalt::as_result_tag` and `cobalt::as_tuple_tag`.:

[source,cpp, subs="+quotes"]
----
__your_result_type__ await_resume(cobalt::as_result_tag);
__your_tuple_type__  await_resume(cobalt::as_tuple_tag);
----

This allows an awaitable to provide other error types than `std::exception_ptr`,
for example `system::error_code`. This is done by <<op,op>> and <<channel,channel>>.

[source,cpp]
----
// example of an op with result system::error_code, std::size_t
system::result<std::size_t>                 await_resume(cobalt::as_result_tag);
std::tuple<system::error_code, std::size_t> await_resume(cobalt::as_tuple_tag);
----

NOTE: Awaitables are still allowed to throw exceptions, e.g. for critical exceptions such as OOM.

