From 1f605407bdd57db8d5101dc5778807b0141d960f Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Tue, 29 Aug 2023 16:57:22 +0200 Subject: [PATCH] LibIMAP: Reject a promise if a response couldn't be parsed Promises can take an Error type now for quite some time, so let's use it instead of returning an empty Optional type in the result field. :^) Ideally we should give a more detailed info of what failed to parse, but this will do for now. --- Userland/Libraries/LibIMAP/Client.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibIMAP/Client.cpp b/Userland/Libraries/LibIMAP/Client.cpp index a38f351235..4e7740d8d3 100644 --- a/Userland/Libraries/LibIMAP/Client.cpp +++ b/Userland/Libraries/LibIMAP/Client.cpp @@ -193,7 +193,7 @@ NonnullRefPtr>> cast_promise(NonnullRefPtrmap>( [](Optional& variant) { - return variant.has_value() ? move(variant->get()) : Optional(); + return move(variant->get()); }); return new_promise; } @@ -250,8 +250,7 @@ ErrorOr Client::handle_parsed_response(ParseStatus&& parse_status) bool should_send_next = false; if (!parse_status.successful) { m_expecting_response = false; - m_pending_promises.first()->resolve({}); - m_pending_promises.remove(0); + m_pending_promises.take_first()->reject(Error::from_string_literal("Failed to parse message")); } if (parse_status.response.has_value()) { m_expecting_response = false; @@ -409,15 +408,15 @@ NonnullRefPtr>> Client::append(StringView mailbo auto response_promise = Promise>::construct(); m_pending_promises.append(response_promise); - continue_req->on_resolution = [this, message2 { move(message) }](auto& data) -> ErrorOr { - if (!data.has_value()) { - TRY(handle_parsed_response({ .successful = false, .response = {} })); - } else { - TRY(send_raw(message2.data)); - m_expecting_response = true; - } + continue_req->on_resolution = [this, message2 { move(message) }](auto&) -> ErrorOr { + TRY(send_raw(message2.data)); + m_expecting_response = true; return {}; }; + continue_req->on_rejection = [this](Error&) { + // NOTE: This never fails. + MUST(handle_parsed_response({ .successful = false, .response = {} })); + }; return cast_promise(response_promise); }