11#include <QNetworkReply>
24 QObject::connect (reply,
25 &QNetworkReply::finished,
29 reply->deleteLater ();
30 f (reply->readAll ());
58 template<
typename... Args>
66 promise.reportStarted ();
68 QObject::connect (reply,
69 &QNetworkReply::finished,
71 [promise, reply] ()
mutable
73 reply->deleteLater ();
75 if constexpr (std::is_same_v<Res, QByteArray>)
76 Util::ReportFutureResult (promise, Result_t::Right (reply->readAll ()));
77 else if constexpr (std::is_same_v<Res, ReplyWithHeaders>)
78 Util::ReportFutureResult (promise, Result_t::Right (Res { reply }));
80 static_assert (std::is_same_v<Res, struct Dummy>,
"Unsupported reply type");
82 QObject::connect (reply,
83 Util::Overload<QNetworkReply::NetworkError> (&QNetworkReply::error),
85 [promise, reply] ()
mutable
87 reply->deleteLater ();
89 auto report = [&] (
const Err& val) { Util::ReportFutureResult (promise, Result_t::Left (val)); };
91 if constexpr (std::is_same_v<Err, QString>)
92 report (reply->errorString ());
93 else if constexpr (std::is_same_v<Err, Util::Void>)
95 else if constexpr (std::is_same_v<Err, ReplyError>)
96 report (Err { reply });
98 static_assert (std::is_same_v<Err, struct Dummy>,
"Unsupported error type");
101 return promise.future ();
104 template<
typename... Args>
107 return Sequence (context, HandleReply<Args...> (reply, context));
auto HandleReply(QNetworkReply *reply, QObject *context)
typename detail::Find< Name, Def, Args... >::type Find
void HandleNetworkReply(QObject *context, QNetworkReply *reply, F f)
auto HandleReplySeq(QNetworkReply *reply, QObject *context)
QNetworkReply::NetworkError Error_
A proper void type, akin to unit (or ()) type in functional languages.