cpp Rest API master
C++ library for REST API access with Qt, Curl and cpp-httplib backends
 
Loading...
Searching...
No Matches
coroutine.hpp
Go to the documentation of this file.
1
2#ifndef COROUTINE_HPP_INCLUDED
3#define COROUTINE_HPP_INCLUDED
4
5#include <coroutine>
6#include <exception>
7#include <expected>
8#include <optional>
9#include <string>
10
11#include "iconnection.hpp"
12
13namespace cpp_restapi
14{
15
16 namespace detail
17 {
18
23 {
25 std::string request;
26 std::optional<std::expected<Response, HttpError>> result;
28
29 bool await_ready() const noexcept { return false; }
30
31 void await_suspend(std::coroutine_handle<> h)
32 {
34 [this, h](Response resp) mutable
35 {
36 result.emplace(std::move(resp));
37 h.resume();
38 },
39 [this, h](HttpError err) mutable
40 {
41 result.emplace(std::unexpected(std::move(err)));
42 h.resume();
43 });
44 }
45
46 std::expected<Response, HttpError> await_resume()
47 {
48 return std::move(*result);
49 }
50 };
51
56 {
58 std::string request;
60 std::optional<std::expected<std::string, HttpError>> result;
62
63 bool await_ready() const noexcept { return false; }
64
65 void await_suspend(std::coroutine_handle<> h)
66 {
68 [this, h](std::string body) mutable
69 {
70 result.emplace(std::move(body));
71 h.resume();
72 },
73 [this, h](HttpError err) mutable
74 {
75 result.emplace(std::unexpected(std::move(err)));
76 h.resume();
77 });
78 }
79
80 std::expected<std::string, HttpError> await_resume()
81 {
82 return std::move(*result);
83 }
84 };
85
86 } // namespace detail
87
98 inline detail::FetchAwaitable
99 coFetch(IConnection& connection, const std::string& request)
100 {
101 return {connection, request, {}, {}};
102 }
103
113 inline detail::PaginatedFetchAwaitable
114 coFetch(IConnection& connection, const std::string& request, IPaginationStrategy& strategy)
115 {
116 return {connection, request, strategy, {}, {}};
117 }
118
125 struct Detached
126 {
128 {
130 std::suspend_never initial_suspend() noexcept { return {}; }
131 std::suspend_never final_suspend() noexcept { return {}; }
132 void return_void() {}
133 void unhandled_exception() { std::terminate(); }
134 };
135 };
136
137} // namespace cpp_restapi
138
139#endif
Definition base_connection.hpp:13
std::shared_ptr< std::atomic< bool > > CancellationToken
Token returned by asynchronous fetch(); set it to true to cancel the request.
Definition iconnection.hpp:33
detail::FetchAwaitable coFetch(IConnection &connection, const std::string &request)
Asynchronously fetch a single resource.
Definition coroutine.hpp:99
Definition coroutine.hpp:128
void return_void()
Definition coroutine.hpp:132
std::suspend_never final_suspend() noexcept
Definition coroutine.hpp:131
void unhandled_exception()
Definition coroutine.hpp:133
std::suspend_never initial_suspend() noexcept
Definition coroutine.hpp:130
Detached get_return_object()
Definition coroutine.hpp:129
Fire-and-forget coroutine wrapper.
Definition coroutine.hpp:126
Represents an HTTP or network-level error.
Definition http_error.hpp:28
Interface representing connection with rest api server.
Definition iconnection.hpp:39
virtual std::expected< std::string, HttpError > fetch(const std::string &request)=0
Perform a single HTTP request.
Interface for pagination strategies.
Definition ipagination_strategy.hpp:17
HTTP response containing body, raw headers and the HTTP status code.
Definition iconnection.hpp:26
Awaitable wrapping IConnection::fetch(request, onSuccess, onError)
Definition coroutine.hpp:23
bool await_ready() const noexcept
Definition coroutine.hpp:29
std::string request
Definition coroutine.hpp:25
std::expected< Response, HttpError > await_resume()
Definition coroutine.hpp:46
CancellationToken cancel
Definition coroutine.hpp:27
std::optional< std::expected< Response, HttpError > > result
Definition coroutine.hpp:26
IConnection & connection
Definition coroutine.hpp:24
void await_suspend(std::coroutine_handle<> h)
Definition coroutine.hpp:31
Awaitable wrapping paginated IConnection::fetch.
Definition coroutine.hpp:56
void await_suspend(std::coroutine_handle<> h)
Definition coroutine.hpp:65
std::optional< std::expected< std::string, HttpError > > result
Definition coroutine.hpp:60
std::expected< std::string, HttpError > await_resume()
Definition coroutine.hpp:80
CancellationToken cancel
Definition coroutine.hpp:61
std::string request
Definition coroutine.hpp:58
IConnection & connection
Definition coroutine.hpp:57
bool await_ready() const noexcept
Definition coroutine.hpp:63
IPaginationStrategy & strategy
Definition coroutine.hpp:59