1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 07:17:35 +00:00

LibIMAP: Rename Parser::try_consume() to consume_if()

This commit is contained in:
Tim Ledbetter 2023-10-07 23:43:06 +01:00 committed by Andrew Kaster
parent f97c4d20fa
commit 29c477598c
2 changed files with 58 additions and 58 deletions

View file

@ -22,14 +22,14 @@ ParseStatus Parser::parse(ByteBuffer&& buffer, bool expecting_tag)
m_response = SolidResponse(); m_response = SolidResponse();
} }
if (try_consume("+"sv)) { if (consume_if("+"sv)) {
consume(" "sv); consume(" "sv);
auto data = consume_until_end_of_line(); auto data = consume_until_end_of_line();
consume("\r\n"sv); consume("\r\n"sv);
return { true, { ContinueRequest { data } } }; return { true, { ContinueRequest { data } } };
} }
while (try_consume("*"sv)) { while (consume_if("*"sv)) {
parse_untagged(); parse_untagged();
} }
@ -48,7 +48,7 @@ ParseStatus Parser::parse(ByteBuffer&& buffer, bool expecting_tag)
} }
} }
bool Parser::try_consume(StringView x) bool Parser::consume_if(StringView x)
{ {
dbgln_if(IMAP_PARSER_DEBUG, "p: {}, consume({})", m_position, x); dbgln_if(IMAP_PARSER_DEBUG, "p: {}, consume({})", m_position, x);
size_t i = 0; size_t i = 0;
@ -93,7 +93,7 @@ void Parser::parse_response_done()
void Parser::consume(StringView x) void Parser::consume(StringView x)
{ {
if (!try_consume(x)) { if (!consume_if(x)) {
dbgln("\"{}\" not matched at {}, (buffer length {})", x, m_position, m_buffer.size()); dbgln("\"{}\" not matched at {}, (buffer length {})", x, m_position, m_buffer.size());
m_parsing_failed = true; m_parsing_failed = true;
@ -156,22 +156,22 @@ void Parser::parse_untagged()
return; return;
} }
if (try_consume("CAPABILITY"sv)) { if (consume_if("CAPABILITY"sv)) {
parse_capability_response(); parse_capability_response();
} else if (try_consume("LIST"sv)) { } else if (consume_if("LIST"sv)) {
auto item = parse_list_item(); auto item = parse_list_item();
m_response.data().add_list_item(move(item)); m_response.data().add_list_item(move(item));
} else if (try_consume("LSUB"sv)) { } else if (consume_if("LSUB"sv)) {
auto item = parse_list_item(); auto item = parse_list_item();
m_response.data().add_lsub_item(move(item)); m_response.data().add_lsub_item(move(item));
} else if (try_consume("FLAGS"sv)) { } else if (consume_if("FLAGS"sv)) {
consume(" "sv); consume(" "sv);
auto flags = parse_list(+[](StringView x) { return DeprecatedString(x); }); auto flags = parse_list(+[](StringView x) { return DeprecatedString(x); });
m_response.data().set_flags(move(flags)); m_response.data().set_flags(move(flags));
consume("\r\n"sv); consume("\r\n"sv);
} else if (try_consume("OK"sv)) { } else if (consume_if("OK"sv)) {
consume(" "sv); consume(" "sv);
if (try_consume("["sv)) { if (consume_if("["sv)) {
auto actual_type = parse_atom(); auto actual_type = parse_atom();
if (actual_type == "CLOSED"sv) { if (actual_type == "CLOSED"sv) {
// No-op. // No-op.
@ -203,25 +203,25 @@ void Parser::parse_untagged()
} }
consume_until_end_of_line(); consume_until_end_of_line();
consume("\r\n"sv); consume("\r\n"sv);
} else if (try_consume("SEARCH"sv)) { } else if (consume_if("SEARCH"sv)) {
Vector<unsigned> ids; Vector<unsigned> ids;
while (!try_consume("\r\n"sv)) { while (!consume_if("\r\n"sv)) {
consume(" "sv); consume(" "sv);
auto id = MUST(parse_number()); auto id = MUST(parse_number());
ids.append(id); ids.append(id);
} }
m_response.data().set_search_results(move(ids)); m_response.data().set_search_results(move(ids));
} else if (try_consume("BYE"sv)) { } else if (consume_if("BYE"sv)) {
auto message = consume_until_end_of_line(); auto message = consume_until_end_of_line();
consume("\r\n"sv); consume("\r\n"sv);
m_response.data().set_bye(message.is_empty() ? Optional<DeprecatedString>() : Optional<DeprecatedString>(message)); m_response.data().set_bye(message.is_empty() ? Optional<DeprecatedString>() : Optional<DeprecatedString>(message));
} else if (try_consume("STATUS"sv)) { } else if (consume_if("STATUS"sv)) {
consume(" "sv); consume(" "sv);
auto mailbox = parse_astring(); auto mailbox = parse_astring();
consume(" ("sv); consume(" ("sv);
auto status_item = StatusItem(); auto status_item = StatusItem();
status_item.set_mailbox(mailbox); status_item.set_mailbox(mailbox);
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
auto status_att = parse_atom(); auto status_att = parse_atom();
consume(" "sv); consume(" "sv);
auto value = MUST(parse_number()); auto value = MUST(parse_number());
@ -248,7 +248,7 @@ void Parser::parse_untagged()
consume(" "sv); consume(" "sv);
} }
m_response.data().set_status(move(status_item)); m_response.data().set_status(move(status_item));
try_consume(" "sv); // Not in the spec but the Outlook server sends a space for some reason. consume_if(" "sv); // Not in the spec but the Outlook server sends a space for some reason.
consume("\r\n"sv); consume("\r\n"sv);
} else { } else {
auto x = consume_until_end_of_line(); auto x = consume_until_end_of_line();
@ -268,7 +268,7 @@ StringView Parser::parse_quoted_string()
StringView Parser::parse_string() StringView Parser::parse_string()
{ {
if (try_consume("\""sv)) { if (consume_if("\""sv)) {
return parse_quoted_string(); return parse_quoted_string();
} else { } else {
return parse_literal_string(); return parse_literal_string();
@ -278,7 +278,7 @@ StringView Parser::parse_string()
Optional<StringView> Parser::parse_nstring() Optional<StringView> Parser::parse_nstring()
{ {
dbgln_if(IMAP_PARSER_DEBUG, "p: {} parse_nstring()", m_position); dbgln_if(IMAP_PARSER_DEBUG, "p: {} parse_nstring()", m_position);
if (try_consume("NIL"sv)) if (consume_if("NIL"sv))
return {}; return {};
else else
return { parse_string() }; return { parse_string() };
@ -289,7 +289,7 @@ FetchResponseData Parser::parse_fetch_response()
consume(" ("sv); consume(" ("sv);
auto fetch_response = FetchResponseData(); auto fetch_response = FetchResponseData();
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
auto data_item = parse_fetch_data_item(); auto data_item = parse_fetch_data_item();
switch (data_item.type) { switch (data_item.type) {
case FetchCommand::DataItemType::BodyStructure: { case FetchCommand::DataItemType::BodyStructure: {
@ -379,38 +379,38 @@ BodyStructure Parser::parse_body_structure()
{ {
if (!at_end() && m_buffer[m_position] == '(') { if (!at_end() && m_buffer[m_position] == '(') {
auto data = MultiPartBodyStructureData(); auto data = MultiPartBodyStructureData();
while (try_consume("("sv)) { while (consume_if("("sv)) {
auto child = parse_body_structure(); auto child = parse_body_structure();
data.bodies.append(make<BodyStructure>(move(child))); data.bodies.append(make<BodyStructure>(move(child)));
} }
consume(" "sv); consume(" "sv);
data.multipart_subtype = parse_string(); data.multipart_subtype = parse_string();
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
data.params = try_consume("NIL"sv) ? Optional<HashMap<DeprecatedString, DeprecatedString>>() : parse_body_fields_params(); data.params = consume_if("NIL"sv) ? Optional<HashMap<DeprecatedString, DeprecatedString>>() : parse_body_fields_params();
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
if (!try_consume("NIL"sv)) { if (!consume_if("NIL"sv)) {
data.disposition = { parse_disposition() }; data.disposition = { parse_disposition() };
} }
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
if (!try_consume("NIL"sv)) { if (!consume_if("NIL"sv)) {
data.langs = { parse_langs() }; data.langs = { parse_langs() };
} }
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
data.location = try_consume("NIL"sv) ? Optional<DeprecatedString>() : Optional<DeprecatedString>(parse_string()); data.location = consume_if("NIL"sv) ? Optional<DeprecatedString>() : Optional<DeprecatedString>(parse_string());
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
Vector<BodyExtension> extensions; Vector<BodyExtension> extensions;
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
extensions.append(parse_body_extension()); extensions.append(parse_body_extension());
try_consume(" "sv); consume_if(" "sv);
} }
data.extensions = { move(extensions) }; data.extensions = { move(extensions) };
} }
@ -470,37 +470,37 @@ BodyStructure Parser::parse_one_part_body()
// NOTE: "media-basic SP body-fields" is already parsed. // NOTE: "media-basic SP body-fields" is already parsed.
} }
if (!try_consume(")"sv)) { if (!consume_if(")"sv)) {
consume(" "sv); consume(" "sv);
// body-ext-1part // body-ext-1part
[&]() { [&]() {
data.md5 = Optional<DeprecatedString>(parse_nstring()); data.md5 = Optional<DeprecatedString>(parse_nstring());
if (try_consume(")"sv)) if (consume_if(")"sv))
return; return;
consume(" "sv); consume(" "sv);
if (!try_consume("NIL"sv)) { if (!consume_if("NIL"sv)) {
auto disposition = parse_disposition(); auto disposition = parse_disposition();
data.disposition = { disposition }; data.disposition = { disposition };
} }
if (try_consume(")"sv)) if (consume_if(")"sv))
return; return;
consume(" "sv); consume(" "sv);
if (!try_consume("NIL"sv)) { if (!consume_if("NIL"sv)) {
data.langs = { parse_langs() }; data.langs = { parse_langs() };
} }
if (try_consume(")"sv)) if (consume_if(")"sv))
return; return;
consume(" "sv); consume(" "sv);
data.location = Optional<DeprecatedString>(parse_nstring()); data.location = Optional<DeprecatedString>(parse_nstring());
Vector<BodyExtension> extensions; Vector<BodyExtension> extensions;
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
extensions.append(parse_body_extension()); extensions.append(parse_body_extension());
try_consume(" "sv); consume_if(" "sv);
} }
data.extensions = { move(extensions) }; data.extensions = { move(extensions) };
}(); }();
@ -511,12 +511,12 @@ BodyStructure Parser::parse_one_part_body()
Vector<DeprecatedString> Parser::parse_langs() Vector<DeprecatedString> Parser::parse_langs()
{ {
AK::Vector<DeprecatedString> langs; AK::Vector<DeprecatedString> langs;
if (!try_consume("("sv)) { if (!consume_if("("sv)) {
langs.append(parse_string()); langs.append(parse_string());
} else { } else {
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
langs.append(parse_string()); langs.append(parse_string());
try_consume(" "sv); consume_if(" "sv);
} }
} }
return langs; return langs;
@ -568,7 +568,7 @@ ListItem Parser::parse_list_item()
void Parser::parse_capability_response() void Parser::parse_capability_response()
{ {
auto capability = AK::Vector<DeprecatedString>(); auto capability = AK::Vector<DeprecatedString>();
while (!try_consume("\r\n"sv)) { while (!consume_if("\r\n"sv)) {
consume(" "sv); consume(" "sv);
auto x = DeprecatedString(parse_atom()); auto x = DeprecatedString(parse_atom());
capability.append(x); capability.append(x);
@ -618,7 +618,7 @@ Vector<T> Parser::parse_list(T converter(StringView))
consume("("sv); consume("("sv);
Vector<T> x; Vector<T> x;
bool first = true; bool first = true;
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
if (!first) if (!first)
consume(" "sv); consume(" "sv);
auto item = consume_while([](u8 x) { auto item = consume_while([](u8 x) {
@ -686,7 +686,7 @@ StringView Parser::consume_until_end_of_line()
FetchCommand::DataItem Parser::parse_fetch_data_item() FetchCommand::DataItem Parser::parse_fetch_data_item()
{ {
auto msg_attr = consume_while([](u8 x) { return is_ascii_alpha(x) != 0; }); auto msg_attr = consume_while([](u8 x) { return is_ascii_alpha(x) != 0; });
if (msg_attr.equals_ignoring_ascii_case("BODY"sv) && try_consume("["sv)) { if (msg_attr.equals_ignoring_ascii_case("BODY"sv) && consume_if("["sv)) {
auto data_item = FetchCommand::DataItem { auto data_item = FetchCommand::DataItem {
.type = FetchCommand::DataItemType::BodySection, .type = FetchCommand::DataItemType::BodySection,
.section = { {} } .section = { {} }
@ -714,7 +714,7 @@ FetchCommand::DataItem Parser::parse_fetch_data_item()
data_item.section->type = FetchCommand::DataItem::SectionType::Parts; data_item.section->type = FetchCommand::DataItem::SectionType::Parts;
data_item.section->parts = Vector<unsigned>(); data_item.section->parts = Vector<unsigned>();
while (!try_consume("]"sv)) { while (!consume_if("]"sv)) {
auto num = try_parse_number(); auto num = try_parse_number();
if (num.has_value()) { if (num.has_value()) {
data_item.section->parts->append(num.value()); data_item.section->parts->append(num.value());
@ -734,13 +734,13 @@ FetchCommand::DataItem Parser::parse_fetch_data_item()
dbgln("Unmatched section type {}", section_type); dbgln("Unmatched section type {}", section_type);
m_parsing_failed = true; m_parsing_failed = true;
} }
if (try_consume("<"sv)) { if (consume_if("<"sv)) {
auto start = MUST(parse_number()); auto start = MUST(parse_number());
data_item.partial_fetch = true; data_item.partial_fetch = true;
data_item.start = (int)start; data_item.start = (int)start;
consume(">"sv); consume(">"sv);
} }
try_consume(" "sv); consume_if(" "sv);
return data_item; return data_item;
} else if (msg_attr.equals_ignoring_ascii_case("FLAGS"sv)) { } else if (msg_attr.equals_ignoring_ascii_case("FLAGS"sv)) {
return FetchCommand::DataItem { return FetchCommand::DataItem {
@ -770,12 +770,12 @@ FetchCommand::DataItem Parser::parse_fetch_data_item()
} }
Optional<Vector<Address>> Parser::parse_address_list() Optional<Vector<Address>> Parser::parse_address_list()
{ {
if (try_consume("NIL"sv)) if (consume_if("NIL"sv))
return {}; return {};
auto addresses = Vector<Address>(); auto addresses = Vector<Address>();
consume("("sv); consume("("sv);
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
addresses.append(parse_address()); addresses.append(parse_address());
if (!at_end() && m_buffer[m_position] != ')') if (!at_end() && m_buffer[m_position] != ')')
consume(" "sv); consume(" "sv);
@ -810,30 +810,30 @@ StringView Parser::parse_astring()
} }
HashMap<DeprecatedString, DeprecatedString> Parser::parse_body_fields_params() HashMap<DeprecatedString, DeprecatedString> Parser::parse_body_fields_params()
{ {
if (try_consume("NIL"sv)) if (consume_if("NIL"sv))
return {}; return {};
HashMap<DeprecatedString, DeprecatedString> fields; HashMap<DeprecatedString, DeprecatedString> fields;
consume("("sv); consume("("sv);
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
auto key = parse_string(); auto key = parse_string();
consume(" "sv); consume(" "sv);
auto value = parse_string(); auto value = parse_string();
fields.set(key, value); fields.set(key, value);
try_consume(" "sv); consume_if(" "sv);
} }
return fields; return fields;
} }
BodyExtension Parser::parse_body_extension() BodyExtension Parser::parse_body_extension()
{ {
if (try_consume("NIL"sv)) { if (consume_if("NIL"sv)) {
return BodyExtension { Optional<DeprecatedString> {} }; return BodyExtension { Optional<DeprecatedString> {} };
} else if (try_consume("("sv)) { } else if (consume_if("("sv)) {
Vector<OwnPtr<BodyExtension>> extensions; Vector<OwnPtr<BodyExtension>> extensions;
while (!try_consume(")"sv)) { while (!consume_if(")"sv)) {
extensions.append(make<BodyExtension>(parse_body_extension())); extensions.append(make<BodyExtension>(parse_body_extension()));
try_consume(" "sv); consume_if(" "sv);
} }
return BodyExtension { move(extensions) }; return BodyExtension { move(extensions) };
} else if (!at_end() && (m_buffer[m_position] == '"' || m_buffer[m_position] == '{')) { } else if (!at_end() && (m_buffer[m_position] == '"' || m_buffer[m_position] == '{')) {

View file

@ -26,7 +26,7 @@ private:
static MailboxFlag parse_mailbox_flag(StringView); static MailboxFlag parse_mailbox_flag(StringView);
void consume(StringView); void consume(StringView);
bool try_consume(StringView); bool consume_if(StringView);
StringView consume_while(Function<bool(u8)> should_consume); StringView consume_while(Function<bool(u8)> should_consume);
StringView consume_until_end_of_line(); StringView consume_until_end_of_line();