32 #include <QNetworkReply>
48 new Util::SlotClosure<Util::DeleteLaterPolicy>
52 reply->deleteLater ();
53 f (reply->readAll ());
70 QHash<QByteArray, QList<QByteArray>> Headers_;
72 explicit ReplyWithHeaders (QNetworkReply*);
77 QNetworkReply::NetworkError Error_;
80 QVariant HttpStatusCode_;
82 explicit ReplyError (QNetworkReply*);
85 template<
typename... Args>
86 auto HandleReply (QNetworkReply *reply, QObject *context)
88 using Err =
Find<ErrorInfo, Util::Void, Args...>;
89 using Res =
Find<ResultInfo, QByteArray, Args...>;
91 using Result_t = Util::Either<Err, Res>;
93 promise.reportStarted ();
95 QObject::connect (reply,
96 &QNetworkReply::finished,
98 [promise, reply] ()
mutable
100 reply->deleteLater ();
102 if constexpr (std::is_same_v<Res, QByteArray>)
103 Util::ReportFutureResult (promise, Result_t::Right (reply->readAll ()));
104 else if constexpr (std::is_same_v<Res, ReplyWithHeaders>)
105 Util::ReportFutureResult (promise, Result_t::Right (Res { reply }));
107 static_assert (std::is_same_v<Res, struct Dummy>,
"Unsupported reply type");
109 QObject::connect (reply,
110 Util::Overload<QNetworkReply::NetworkError> (&QNetworkReply::error),
112 [promise, reply] ()
mutable
114 reply->deleteLater ();
116 auto report = [&] (
const Err& val) { Util::ReportFutureResult (promise, Result_t::Left (val)); };
118 if constexpr (std::is_same_v<Err, QString>)
119 report (reply->errorString ());
120 else if constexpr (std::is_same_v<Err, Util::Void>)
122 else if constexpr (std::is_same_v<Err, ReplyError>)
123 report (Err { reply });
125 static_assert (std::is_same_v<Err, struct Dummy>,
"Unsupported error type");
128 return promise.future ();
131 template<
typename... Args>
134 return Sequence (context, HandleReply<Args...> (reply, context));