Add class RequestPromise.

This commit is contained in:
levlam 2024-08-15 20:33:44 +03:00
parent f23959070b
commit d97ae6c98d

View File

@ -50,14 +50,43 @@ class Requests {
std::shared_ptr<DownloadFileCallback> download_file_callback_;
template <class T>
Promise<T> create_request_promise(uint64 id) {
return PromiseCreator::lambda([actor_id = td_actor_, id](Result<T> r_state) {
if (r_state.is_error()) {
send_closure(actor_id, &Td::send_error, id, r_state.move_as_error());
} else {
send_closure(actor_id, &Td::send_result, id, r_state.move_as_ok());
class RequestPromise : public PromiseInterface<T> {
enum class State : int32 { Empty, Ready, Complete };
ActorId<Td> td_actor_;
uint64 request_id_;
MovableValue<State> state_{State::Empty};
public:
void set_value(T &&value) override {
CHECK(state_.get() == State::Ready);
send_closure(td_actor_, &Td::send_result, request_id_, std::move(value));
state_ = State::Complete;
}
});
void set_error(Status &&error) override {
if (state_.get() == State::Ready) {
send_closure(td_actor_, &Td::send_error, request_id_, std::move(error));
state_ = State::Complete;
}
}
RequestPromise(const RequestPromise &) = delete;
RequestPromise &operator=(const RequestPromise &) = delete;
RequestPromise(RequestPromise &&) = default;
RequestPromise &operator=(RequestPromise &&) = default;
~RequestPromise() override {
if (state_.get() == State::Ready) {
send_closure(td_actor_, &Td::send_error, request_id_, Status::Error("Lost promise"));
}
}
RequestPromise(ActorId<Td> td_actor, uint64 request_id)
: td_actor_(std::move(td_actor)), request_id_(request_id), state_(State::Ready) {
}
};
template <class T>
Promise<T> create_request_promise(uint64 request_id) const {
return Promise<T>(td::make_unique<RequestPromise<T>>(td_actor_, request_id));
}
Promise<Unit> create_ok_request_promise(uint64 id);