mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 16:19:53 +07:00
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
/*******************************************************************************
|
|
* This file is part of the "Enduro2D"
|
|
* For conditions of distribution and use, see copyright notice in LICENSE.md
|
|
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
|
|
******************************************************************************/
|
|
|
|
#include <enduro2d/core/network.hpp>
|
|
|
|
namespace e2d
|
|
{
|
|
class network::internal_state final : private e2d::noncopyable {
|
|
public:
|
|
internal_state() = default;
|
|
~internal_state() noexcept = default;
|
|
private:
|
|
net::performer performer_;
|
|
};
|
|
}
|
|
|
|
namespace e2d
|
|
{
|
|
network::network()
|
|
: state_(new internal_state()) {}
|
|
network::~network() noexcept = default;
|
|
|
|
network_request network::request(net::request_builder& rb) {
|
|
return request(std::move(rb));
|
|
}
|
|
|
|
network_request network::request(net::request_builder&& rb) {
|
|
if ( rb.callback() ) {
|
|
throw bad_network_operation();
|
|
}
|
|
stdex::promise<net::response> promise;
|
|
rb.callback([promise](net::request request) mutable {
|
|
if ( request.is_done() ) {
|
|
promise.resolve(request.take());
|
|
return;
|
|
}
|
|
if ( request.status() == net::req_status::cancelled ) {
|
|
promise.reject(request_cancelled_exception());
|
|
} else {
|
|
promise.reject(request_network_error(request.get_error()));
|
|
}
|
|
});
|
|
return {rb.send(), std::move(promise)};
|
|
}
|
|
}
|